入参模型更新:

UpsertTrackInput(新增/更新轨迹):来源轨迹明细新增的相关字段
BatchUpsertTrackInput(批量新增更新/轨迹):来源轨迹明细新增的相关字段

反参模型更新:
TrackOrderDetailDto(查询轨迹明细)

feat:
- 增加(新增/更新轨迹)(单个/批量)入参【目的地时区】和【预计到达时间】的校验
- 增加(删除轨迹)(单个/批量)外部来源不允许删除的约束(异常后同步返回)
- 当(新增/更新轨迹)(单个/批量)时如果输入【目的地时区】和【预计到达时间】则同步到订单主表
- 支持【轨迹内容】【轨迹内容英文】的二次修改,修改内容来源于请求
- 【批量新增轨迹】增加当内容不允许重复时,更新相同code的轨迹明细的轨迹内容,并限制不允许更改轨迹来源
This commit is contained in:
云龙 王 2024-11-14 17:05:45 +08:00
parent 725f60bed3
commit 6a2faf90a2
12 changed files with 476 additions and 15 deletions

View File

@ -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; }
} }

View File

@ -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; }
} }

View File

@ -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; }
} }

View File

@ -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; }
} }

View File

@ -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

View File

@ -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);
} }

View File

@ -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)

View File

@ -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);
} }

View File

@ -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);
} }

View File

@ -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);

View 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,
}

View File

@ -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,