diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs
index d8cab392..337d02a7 100644
--- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs
+++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs
@@ -35,4 +35,67 @@ public class BatchUpsertTrackInput : OrderNosInfo
[Required]
[Range(-12, 12)]
public float TrackTimeZone { get; set; }
+
+ ///
+ /// 客户是否可见
+ ///
+ [Required]
+ public bool IsVisibility { get; set; }
+
+ ///
+ /// 数据来源:1外部服务商创建,2内部系统创建,3人工创建
+ ///
+ [Required]
+ public int Source { get; set; }
+
+ ///
+ /// 轨迹备注
+ ///
+ public string? Remarks { get; set; }
+
+ ///
+ /// 附件集合
+ ///
+ public List? Files { get; set; }
+
+ ///
+ /// 轨迹内容,若为空则取轨迹内容表中该轨迹Code对应的轨迹内容
+ ///
+ public string? Content { get; set; }
+
+ ///
+ /// 轨迹内容英文,若为空则取轨迹内容表中该轨迹Code对应的轨迹英文内容
+ ///
+ public string? EnStatus { get; set; }
+
+ ///
+ /// 轨迹发生地(城市)
+ ///
+ public string? TrackPlaceCity { get; set; }
+
+ ///
+ /// 轨迹发生地(省/州)
+ ///
+ public string? TrackPlaceProvince { get; set; }
+
+ ///
+ /// 轨迹发生地(国家/地区)
+ ///
+ public string? TrackPlaceNation { get; set; }
+
+ ///
+ /// 轨迹发生地邮编
+ ///
+ public string? TrackPlacePostcode { get; set; }
+
+ ///
+ /// 预计到达时间
+ ///
+ public DateTime? EstimatedDeliveryDate { get; set; }
+
+ ///
+ /// 目的地时区
+ ///
+ [Range(-12, 12)]
+ public float? DestinationTimeZone { get; set; }
}
diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetOrderDetailsInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetOrderDetailsInput.cs
index 265723e8..23cdaec4 100644
--- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetOrderDetailsInput.cs
+++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetOrderDetailsInput.cs
@@ -86,4 +86,54 @@ public class TrackOrderDetailDto
/// 创建人
///
public string? CreateUser { get; set; }
+
+ ///
+ /// 客户是否可见
+ ///
+ public bool IsVisibility { get; set; }
+
+ ///
+ /// 数据来源:1外部服务商创建,2内部系统创建,3人工创建
+ ///
+ public int Source { get; set; }
+
+ ///
+ /// 备注
+ ///
+ public string? Remarks { get; set; }
+
+ ///
+ /// 附件集合
+ ///
+ public List? Files { get; set; }
+
+ ///
+ /// 轨迹发生地(城市)
+ ///
+ public string? TrackPlaceCity { get; set; }
+
+ ///
+ /// 轨迹发生地(省/州)
+ ///
+ public string? TrackPlaceProvince { get; set; }
+
+ ///
+ /// 轨迹发生地(国家/地区)
+ ///
+ public string? TrackPlaceNation { get; set; }
+
+ ///
+ /// 轨迹发生地邮编
+ ///
+ public string? TrackPlacePostcode { get; set; }
+
+ ///
+ /// 预计到达时间
+ ///
+ public DateTime? EstimatedDeliveryDate { get; set; }
+
+ ///
+ /// 目的地时区
+ ///
+ public float? DestinationTimeZone { get; set; }
}
diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs
index 945a973b..d38a19e4 100644
--- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs
+++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs
@@ -35,4 +35,67 @@ public class UpsertTrackInput : OrderNoInfo
[Required]
[Range(-12, 12)]
public float? TrackTimeZone { get; set; }
+
+ ///
+ /// 客户是否可见
+ ///
+ [Required]
+ public bool IsVisibility { get; set; }
+
+ ///
+ /// 数据来源:1外部服务商创建,2内部系统创建,3人工创建
+ ///
+ [Required]
+ public int Source { get; set; }
+
+ ///
+ /// 轨迹备注
+ ///
+ public string? Remarks { get; set; }
+
+ ///
+ /// 附件集合
+ ///
+ public List? Files { get; set; }
+
+ ///
+ /// 轨迹内容,若为空则取轨迹内容表中该轨迹Code对应的轨迹内容
+ ///
+ public string? Content { get; set; }
+
+ ///
+ /// 轨迹内容英文,若为空则取轨迹内容表中该轨迹Code对应的轨迹英文内容
+ ///
+ public string? EnStatus { get; set; }
+
+ ///
+ /// 轨迹发生地(城市)
+ ///
+ public string? TrackPlaceCity { get; set; }
+
+ ///
+ /// 轨迹发生地(省/州)
+ ///
+ public string? TrackPlaceProvince { get; set; }
+
+ ///
+ /// 轨迹发生地(国家/地区)
+ ///
+ public string? TrackPlaceNation { get; set; }
+
+ ///
+ /// 轨迹发生地邮编
+ ///
+ public string? TrackPlacePostcode { get; set; }
+
+ ///
+ /// 预计到达时间
+ ///
+ public DateTime? EstimatedDeliveryDate { get; set; }
+
+ ///
+ /// 目的地时区
+ ///
+ [Range(-12, 12)]
+ public float? DestinationTimeZone { get; set; }
}
diff --git a/src/SJZY.Track.Application.Contract/Events/TrackChangeAfterUpdateOrderEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackChangeAfterUpdateOrderEvent.cs
index 037c5a8c..90c807d0 100644
--- a/src/SJZY.Track.Application.Contract/Events/TrackChangeAfterUpdateOrderEvent.cs
+++ b/src/SJZY.Track.Application.Contract/Events/TrackChangeAfterUpdateOrderEvent.cs
@@ -41,4 +41,14 @@ public class TrackChangeAfterUpdateOrderEvent
/// 时区缺失和发生地缺失标记,1表示时区,2表示发生地,3表示两种
///
public int DeficiencyTagValue { get; set; }
+
+ ///
+ /// 预计到达时间
+ ///
+ public DateTime? EstimatedDeliveryDate { get; set; }
+
+ ///
+ /// 签收地时区
+ ///
+ public float? DestinationTimeZone { get; set; }
}
diff --git a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs
index 1bd4b033..07fa4f95 100644
--- a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs
+++ b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs
@@ -1,3 +1,5 @@
+using SJZY.Track.Application.Contract.Dtos.ProvideServices;
+
namespace SJZY.Track.Application.Contract.Events;
public class TrackUpsertEvent
@@ -54,6 +56,66 @@ public class TrackUpsertEvent
public TrackRefreshStruct TrackRefreshData { get; set; }
+ ///
+ /// 客户是否可见
+ ///
+ public bool IsVisibility { get; set; }
+
+ ///
+ /// 数据来源:1外部服务商创建,2内部系统创建,3人工创建
+ ///
+ public int Source { get; set; }
+
+ ///
+ /// 轨迹备注
+ ///
+ public string? Remarks { get; set; }
+
+ ///
+ /// 附件集合
+ ///
+ public List? Files { get; set; }
+
+ ///
+ /// 轨迹内容,若为空则取轨迹内容表中该轨迹Code对应的轨迹内容
+ ///
+ public string? Content { get; set; }
+
+ ///
+ /// 轨迹内容英文,若为空则取轨迹内容表中该轨迹Code对应的轨迹英文内容
+ ///
+ public string? EnStatus { get; set; }
+
+ ///
+ /// 轨迹发生地(城市)
+ ///
+ public string? TrackPlaceCity { get; set; }
+
+ ///
+ /// 轨迹发生地(省/州)
+ ///
+ public string? TrackPlaceProvince { get; set; }
+
+ ///
+ /// 轨迹发生地(国家/地区)
+ ///
+ public string? TrackPlaceNation { get; set; }
+
+ ///
+ /// 轨迹发生地邮编
+ ///
+ public string? TrackPlacePostcode { get; set; }
+
+ ///
+ /// 预计到达时间
+ ///
+ public DateTime? EstimatedDeliveryDate { get; set; }
+
+ ///
+ /// 目的地时区
+ ///
+ public float? DestinationTimeZone { get; set; }
+
public override string ToString()
{
return
diff --git a/src/SJZY.Track.Application/AutoMapper/OrderAutoMapperProfile.cs b/src/SJZY.Track.Application/AutoMapper/OrderAutoMapperProfile.cs
index 8fc8a9d4..f1a32d4d 100644
--- a/src/SJZY.Track.Application/AutoMapper/OrderAutoMapperProfile.cs
+++ b/src/SJZY.Track.Application/AutoMapper/OrderAutoMapperProfile.cs
@@ -33,6 +33,7 @@ public class OrderAutoMapperProfile : Profile
.ForMember(dest => dest.Content, opt => opt.MapFrom(m => m.TrackContent))
.ForMember(dest => dest.EnContent, opt => opt.MapFrom(m => m.TrackEnContent))
.ForMember(dest => dest.TrackTimeZoneValue, opt => opt.MapFrom(m => m.TrackTimeZone));
+ CreateMap(MemberList.None);
CreateMap(MemberList.None);
}
diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs
index 153e9700..1f32a4e3 100644
--- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs
+++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs
@@ -26,6 +26,8 @@ public class TrackChangeAfterUpdateOrderEventHandler : ITransientDependency, ICa
return;
}
+ //指示是否需要更新【预计签收时间】【签收地时区】
+ var isNeedUpdate = false;
var updateOrders = new List();
foreach (var order in orders)
{
@@ -55,20 +57,43 @@ public class TrackChangeAfterUpdateOrderEventHandler : ITransientDependency, ICa
order.LatestTrackPlace = @event.TrackPlace;
order.LatestTrackTime = @event.TrackTime;
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);
}
await _orderRepository.UpdateRangeAsync(updateOrders,
- x => new
- {
- x.IsCompleted,
- x.LatestTrackContent,
- x.LatestTrackEnContent,
- x.LatestTrackPlace,
- x.LatestTrackTime,
- x.LatestTrackTimeZone,
- x.DeficiencyTag
- });
+ isNeedUpdate
+ ? x => new
+ {
+ x.IsCompleted,
+ x.LatestTrackContent,
+ x.LatestTrackEnContent,
+ x.LatestTrackPlace,
+ x.LatestTrackTime,
+ x.LatestTrackTimeZone,
+ 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> GetOrdersAsync(int[] orderIds)
diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs
index f30f51fc..ef68e72f 100644
--- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs
+++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs
@@ -5,6 +5,7 @@ using SJZY.Track.Application.Contract.Events;
using SJZY.Track.Domain.Aggregates.OrderAggregate;
using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
using SJZY.Track.Domain.Dtos.TrackContents;
+using SJZY.Track.Domain.Enums;
using SJZY.Track.Domain.Queries;
using Volo.Abp.DependencyInjection;
using OrderIdentifier = SJZY.Track.Application.Contract.Events.OrderIdentifier;
@@ -171,6 +172,8 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
TrackPlace = @event.TrackPlace,
TrackTime = @event.TrackTime,
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();
// important:轨迹code相同,时间、发生地不同的,可能存在多条!!
+ //todo:查出多条轨迹,同订单同code也可能出现多条,
+ //按同code找轨迹如果有多条则不允许修改,如果没有则进行新增
var tracks = await _trackDetailsEsRepository.GetListAsync(orderIds, @event.TrackCode, true);
var insertTracks = new List();
var updateTracks = new List();
+ //todo:标识轨迹内容是否是重复的,将来需要替换会从轨迹内容中获取
+ var isRepeatable = true;
foreach (var order in @event.OrderIdentifiers)
{
TrackDetailsIndex? track;
if (!@event.IsAdd)
{
+ //同一订单同轨迹code如果有多条轨迹明细则不允许修改
var existTracks = tracks.Where(x => x.OrderId == order.OrderId).ToArray();
if (existTracks.Length > 1)
{
@@ -220,13 +228,39 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
track = existTracks.FirstOrDefault();
if (track == null) continue; // 不存在不让改
+
+ //来源与外部服务商不允许修改
+ if (track.Source == (int) TrackSourceEnum.ExternalServiceProvide) continue;
}
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)
@@ -246,9 +280,25 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
OriginTrackDataHash = @event.TrackRefreshData.OriginTrackDataHash ?? GlobalConst.EmptyString,
CreateUser = @event.OperationMan ?? GlobalConst.SystemUser,
CreateTime = DateTime.Now,
+ //来源轨迹内容,第一次新增的时候使用轨迹内容表提供的
TrackStatus = trackContent.TrackStatus,
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
@@ -267,6 +317,27 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
track.UpdateUser = @event.OperationMan ?? GlobalConst.SystemUser;
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);
}
diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs
index 63fdd064..1b99555b 100644
--- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs
+++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs
@@ -5,6 +5,7 @@ using SJZY.Track.Application.Contract.Services.ProvideServices;
using SJZY.Track.Domain.Aggregates.OrderAggregate;
using SJZY.Track.Domain.Aggregates.TrackContentAggregate;
using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
+using SJZY.Track.Domain.Enums;
using SJZY.UserCenter.HttpApi.Services;
using Volo.Abp.Http.Client.DynamicProxying;
@@ -59,6 +60,12 @@ public partial class TrackService : ApplicationService, ITrackService
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();
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 tracks = await _trackDetailsEsRepository
+ .GetListAsync(new[] { orderId }, input.TrackCodes, TrackSourceEnum.ExternalServiceProvide);
+ if (tracks.Count > 0)
+ {
+ throw new BusinessException(message: "存在来源于外部服务商的轨迹,不允许删除");
+ }
+
// 删除轨迹
var @event = new TrackDeleteEvent
{
@@ -153,6 +168,14 @@ public partial class TrackService : ApplicationService, ITrackService
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
{
@@ -191,6 +214,12 @@ public partial class TrackService : ApplicationService, ITrackService
throw new BusinessException(message: "订单一个都不存在");
}
+ if ((input.EstimatedDeliveryDate.HasValue == false && input.DestinationTimeZone.HasValue) ||
+ (input.EstimatedDeliveryDate.HasValue && input.DestinationTimeZone.HasValue == false))
+ {
+ throw new BusinessException(message: "【目的地时区】和【预计到达时间】必须同时输入");
+ }
+
// 获取用户name
var userInfo = await _requestCurrentUserService.Service.GetCurrentUserBasicInfoAsync();
if (userInfo.Code != GlobalConst.SuccessCode || userInfo.Data is null)
@@ -216,7 +245,19 @@ public partial class TrackService : ApplicationService, ITrackService
TrackPlace = input.TrackPlace,
TrackTime = input.TrackTime,
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);
}
diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs
index b52f5f20..f68269ff 100644
--- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs
+++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs
@@ -1,4 +1,5 @@
using SJZY.Expand.ElasticSearch.Services;
+using SJZY.Track.Domain.Enums;
namespace SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
@@ -22,6 +23,8 @@ public interface ITrackDetailsEsRepository : IElasticsearchClientService> GetListAsync(int orderId);
+ Task> GetListAsync(int[] orderIds, List trackCodes, TrackSourceEnum source);
+
Task> DeleteTrackAsync(int[] orderIds, List trackCodes);
Task DeleteTrackByIdAsync(string id, string indexName);
diff --git a/src/SJZY.Track.Domain/Enums/TrackSourceEnum.cs b/src/SJZY.Track.Domain/Enums/TrackSourceEnum.cs
new file mode 100644
index 00000000..021616af
--- /dev/null
+++ b/src/SJZY.Track.Domain/Enums/TrackSourceEnum.cs
@@ -0,0 +1,24 @@
+using System.ComponentModel;
+
+namespace SJZY.Track.Domain.Enums;
+
+///
+/// 轨迹来源
+///
+public enum TrackSourceEnum
+{
+ ///
+ /// 外部服务商创建
+ ///
+ [Description("外部服务商创建")] ExternalServiceProvide = 1,
+
+ ///
+ /// 内部系统创建
+ ///
+ [Description("内部系统创建")] InternalService = 2,
+
+ ///
+ /// 人工创建
+ ///
+ [Description("人工创建")] Artificial = 3,
+}
diff --git a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs
index 44715ae6..262d9d32 100644
--- a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs
+++ b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs
@@ -3,6 +3,7 @@ using SJZY.Expand.ABP.Core.PublicMethords;
using SJZY.Expand.ElasticSearch.Services;
using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
using SJZY.Track.Domain.Consts;
+using SJZY.Track.Domain.Enums;
namespace SJZY.Track.Repository.Repositories;
@@ -174,6 +175,19 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract p
.Add("trackPlace", track.TrackPlace)
@@ -181,6 +195,19 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract> GetListAsync(int[] orderIds, List trackCodes, TrackSourceEnum source)
+ {
+ var r = await Context.SearchAsync(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> DeleteTrackAsync(int[] orderIds, List trackCodes)
{
// var deleteResponse = await Context.DeleteByQueryAsync(d => d
@@ -334,6 +381,7 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract new
{
doc.OrderId,