diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchDeleteTrackInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchDeleteTrackInput.cs
index 07db4f25..45ccc51c 100644
--- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchDeleteTrackInput.cs
+++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchDeleteTrackInput.cs
@@ -5,9 +5,9 @@ namespace SJZY.Track.Application.Contract.Dtos.ProvideServices;
public class BatchDeleteTrackInput : OrderNosInfo
{
///
- /// 轨迹code,必填
+ /// 轨迹标识符集合,必填
///
[Required]
[MaxLength(500)]
- public List TrackCodes { get; set; } = new();
+ public List TrackIdentifiers { get; set; } = new();
}
diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/DeleteOrderInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/DeleteOrderInput.cs
index c70c9b42..de305c57 100644
--- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/DeleteOrderInput.cs
+++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/DeleteOrderInput.cs
@@ -9,8 +9,8 @@ public class DeleteOrderInput : OrderNoInfo
public class DeleteTrackInput : OrderNoInfo
{
///
- /// 轨迹code
+ /// 轨迹标识符集合,必填
///
[Required]
- public List TrackCodes { get; set; } = new();
+ public List TrackIdentifiers { get; set; } = new();
}
diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/TrackIdentifierDto.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/TrackIdentifierDto.cs
new file mode 100644
index 00000000..993de61c
--- /dev/null
+++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/TrackIdentifierDto.cs
@@ -0,0 +1,21 @@
+using System.ComponentModel.DataAnnotations;
+
+namespace SJZY.Track.Application.Contract.Dtos.ProvideServices;
+
+///
+/// 轨迹标识符,用于唯一标识一个轨迹
+///
+public sealed class TrackIdentifierDto
+{
+ ///
+ /// 轨迹code
+ ///
+ [Required]
+ public string TrackCode { get; set; }
+
+ ///
+ /// 轨迹发生时间
+ ///
+ [Required]
+ public DateTime TrackTime { get; set; }
+}
diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertOrderInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertOrderInput.cs
index 4bd7b0b7..cfdbe0ac 100644
--- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertOrderInput.cs
+++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertOrderInput.cs
@@ -10,6 +10,16 @@ public class UpsertOrderInput : UpdateOrderInput
[Required]
[Range(1, int.MaxValue)]
public int CustomId { get; set; }
+
+ ///
+ /// 模板code
+ ///
+ public List TemplateCodes { get; set; }
+
+ ///
+ /// 当前操作人
+ ///
+ public int OptionUserId { get; set; }
}
public class OrderFlightInfo
diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs
index b4cf72ae..2ba86e87 100644
--- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs
+++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs
@@ -118,4 +118,9 @@ public class UpsertTrackInput : OrderNoInfo
///
[Range(-12, 12)]
public float? DestinationTimeZone { get; set; }
+
+ ///
+ /// 当前操作人
+ ///
+ public int OptionUserId { get; set; }
}
diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentOutput.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentOutput.cs
index 1102eed6..7af80b7c 100644
--- a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentOutput.cs
+++ b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetAvailableContentOutput.cs
@@ -1,3 +1,5 @@
+using SJZY.Track.Application.Contract.Dtos.ProvideServices;
+
namespace SJZY.Track.Application.Contract.Dtos.TrackContents;
public class GetAvailableContentOutput
@@ -89,4 +91,14 @@ public class GetAvailableContentOutput
/// 目的地时区
///
public float? DestinationTimeZone { get; set; }
+
+ ///
+ /// 附件文件集合
+ ///
+ public List? FileItems { get; set; }
+
+ ///
+ /// 客户是否可见
+ ///
+ public bool IsVisibility { get; set; }
}
diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetContentDetailInput.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetContentDetailInput.cs
new file mode 100644
index 00000000..d61d19bb
--- /dev/null
+++ b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetContentDetailInput.cs
@@ -0,0 +1,29 @@
+namespace SJZY.Track.Application.Contract.Dtos.TrackContents;
+
+public class GetContentDetailInput
+{
+ ///
+ /// 子系统编号
+ ///
+ public int SystemId { get; set; }
+
+ ///
+ /// 订单号
+ ///
+ public string OrderNumber { get; set; }
+
+ ///
+ /// 订单类型
+ ///
+ public int OrderType { get; set; }
+
+ ///
+ /// 轨迹code
+ ///
+ public string TrackCode { get; set; }
+
+ ///
+ /// 轨迹发生时间
+ ///
+ public DateTime TrackTime { get; set; }
+}
diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetContentDetailOutput.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetContentDetailOutput.cs
new file mode 100644
index 00000000..ea58971c
--- /dev/null
+++ b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/GetContentDetailOutput.cs
@@ -0,0 +1,192 @@
+namespace SJZY.Track.Application.Contract.Dtos.TrackContents;
+
+public class GetContentDetailOutput
+{
+ ///
+ /// 子系统
+ ///
+ public int SubSystemId { get; set; }
+
+ ///
+ /// 订单Id
+ ///
+ public int OrderId { get; set; }
+
+ ///
+ /// 订单号
+ ///
+ public string OrderNo { get; set; } = null!;
+
+ ///
+ /// 索引名称
+ ///
+ public string IndexName { get; set; } = null!;
+
+ ///
+ /// 订单类型(主数据枚举TrackOrderType)
+ ///
+ public int OrderType { get; set; }
+
+ ///
+ /// 轨迹状态
+ ///
+ public string TrackStatus { get; set; }
+
+ ///
+ /// 轨迹状态code
+ ///
+ public string TrackStatusCode { get; set; }
+
+ ///
+ /// 轨迹内容代码
+ ///
+ public string TrackCode { get; set; }
+
+ ///
+ /// 轨迹内容
+ ///
+ public string TrackContent { get; set; }
+
+ ///
+ /// 轨迹内容英文
+ ///
+ public string TrackEnContent { get; set; }
+
+ ///
+ /// 服务商code
+ ///
+ public string ServiceProviderCode { get; set; }
+
+ ///
+ /// 原轨迹内容
+ ///
+ public string? OriginTrackContent { get; set; }
+
+ ///
+ /// 原轨迹报文hash(刷新轨迹重复性校验使用)
+ ///
+ public string OriginTrackDataHash { get; set; } = null!;
+
+ ///
+ /// 轨迹发生地
+ ///
+ public string TrackPlace { get; set; }
+
+ ///
+ /// 轨迹发生时间
+ ///
+ public DateTime TrackTime { get; set; }
+
+ ///
+ /// 轨迹发生时区
+ ///
+ public float TrackTimeZone { get; set; }
+
+ ///
+ /// 转化后的轨迹发生时间
+ ///
+ public DateTime ZeroTrackTime { get; set; }
+
+ ///
+ /// 创建人
+ ///
+ public string CreateUser { get; set; }
+
+ ///
+ /// 创建时间
+ ///
+ public DateTime CreateTime { get; set; }
+
+ ///
+ /// 修改人
+ ///
+ public string UpdateUser { get; set; }
+
+ ///
+ /// 修改时间
+ ///
+ public DateTime? UpdateTime { 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; }
+
+ ///
+ /// 轨迹发生地(城市)Id
+ ///
+ public int? TrackPlaceCityId { get; set; }
+
+ ///
+ /// 轨迹发生地(省/州)
+ ///
+ public string? TrackPlaceProvince { get; set; }
+
+ ///
+ ///轨迹发生地(省/州)Id
+ ///
+ public int? TrackPlaceProvinceId { get; set; }
+
+ ///
+ /// 轨迹发生地(国家/地区)
+ ///
+ public string? TrackPlaceNation { get; set; }
+
+ ///
+ /// 轨迹发生地(国家/地区)Id
+ ///
+ public int? TrackPlaceNationId { get; set; }
+
+ ///
+ /// 轨迹发生地邮编
+ ///
+ public string? TrackPlacePostcode { get; set; }
+
+ ///
+ /// 预计签收时间
+ ///
+ public DateTime? EstimatedDeliveryDate { get; set; }
+
+ ///
+ /// 签收地时区
+ ///
+ public float? DestinationTimeZone { get; set; }
+}
+
+public class FileItem
+{
+ ///
+ /// 文件osskey
+ ///
+ public string OssKey { get; set; }
+
+ ///
+ /// 文件名称
+ ///
+ public string FileName { get; set; }
+
+ ///
+ /// 路径
+ ///
+ public string Url { get; set; }
+}
diff --git a/src/SJZY.Track.Application.Contract/Events/TrackDeleteEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackDeleteEvent.cs
index e8072e27..0859de6b 100644
--- a/src/SJZY.Track.Application.Contract/Events/TrackDeleteEvent.cs
+++ b/src/SJZY.Track.Application.Contract/Events/TrackDeleteEvent.cs
@@ -1,3 +1,5 @@
+using SJZY.Track.Application.Contract.Dtos.ProvideServices;
+
namespace SJZY.Track.Application.Contract.Events;
public class TrackDeleteEvent
@@ -18,9 +20,9 @@ public class TrackDeleteEvent
public int[] OrderIds { get; set; } = null!;
///
- /// 轨迹代码
+ /// 轨迹标识符
///
- public List TrackCodes { get; set; } = null!;
+ public List TrackIdentifiers { get; set; } = null!;
///
/// 操作人
@@ -40,6 +42,6 @@ public class TrackDeleteEvent
public override string ToString()
{
return $"[TrackDelete by {OperationMan}] SubSystemId: {SubSystemId}, OrderIds: {string.Join(",",
- OrderIds)}, TrackCodes: {string.Join(",", TrackCodes)}";
+ OrderIds)}, TrackCodes: {string.Join(",", TrackIdentifiers.Select(x=>x.TrackCode))}";
}
}
diff --git a/src/SJZY.Track.Application/AutoMapper/TrackContentAutoMapperProfile.cs b/src/SJZY.Track.Application/AutoMapper/TrackContentAutoMapperProfile.cs
index 862447be..a161314e 100644
--- a/src/SJZY.Track.Application/AutoMapper/TrackContentAutoMapperProfile.cs
+++ b/src/SJZY.Track.Application/AutoMapper/TrackContentAutoMapperProfile.cs
@@ -1,6 +1,7 @@
using AutoMapper;
using SJZY.Track.Application.Contract.Dtos.TrackContents;
using SJZY.Track.Domain.Aggregates.TrackContentAggregate;
+using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
using SJZY.Track.Domain.Dtos.TrackContents;
namespace SJZY.Track.Application.AutoMapper;
@@ -16,5 +17,9 @@ public class TrackContentAutoMapperProfile : Profile
CreateMap, UnifyPageResultDto>(
MemberList.None);
CreateMap(MemberList.None);
+
+ CreateMap(MemberList.None).ReverseMap();
+ CreateMap< SJZY.Track.Domain.Aggregates.TrackDetailsAggregate.FileItem, SJZY.Track.Application.Contract.Dtos.TrackContents.FileItem>(MemberList.None).ReverseMap();
+
}
}
diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs
index 288face2..dd4704ca 100644
--- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs
+++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs
@@ -3,6 +3,7 @@ using BSI.Stack.Rabbit;
using DotNetCore.CAP;
using SJZY.Expand.ABP.Core.Logger;
using SJZY.Expand.ABP.Core.PublicMethords;
+using SJZY.Track.Application.Contract.Dtos.ProvideServices;
using SJZY.Track.Application.Contract.Events;
using SJZY.Track.Domain.Aggregates.OrderAggregate;
using SJZY.Track.Domain.Aggregates.TrackContentAggregate;
@@ -67,22 +68,29 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe
{
var nextEvent = @event.DeepCopy();
nextEvent.Visited.AddRange(@event.OrderIds);
- nextEvent.TrackCodes = @event.TrackCodes;
+ nextEvent.TrackIdentifiers = @event.TrackIdentifiers;
nextEvent.SubSystemId = group.Key;
// 不同子系统需要做内容映射
if (@event.SubSystemId != nextEvent.SubSystemId)
{
- var mapCodes = await _provideQueries
- .MapTrackCodesAsync(@event.SubSystemId, nextEvent.SubSystemId, @event.TrackCodes.ToArray());
+ var codeMaps = await _provideQueries
+ .GetTrackCodeMapsAsync(@event.SubSystemId, nextEvent.SubSystemId,
+ @event.TrackIdentifiers.Select(x => x.TrackCode).ToArray());
- if (mapCodes.Count == 0)
+ if (codeMaps.Count == 0)
{
LogHelper.Warn($"订单跨子系统,未配置内容映射,请联系管理员:{@event}", true);
continue;
}
- nextEvent.TrackCodes = mapCodes;
+ //映射轨迹code
+ foreach (var trackIdentity in nextEvent.TrackIdentifiers)
+ {
+ var match = codeMaps.FirstOrDefault(x => x.MapTrackContentCode == trackIdentity.TrackCode);
+ if (match == null) continue;
+ trackIdentity.TrackCode = match.TrackContentCode;
+ }
}
var identifiers = group.Select(x => x.OrderId).ToList();
@@ -172,7 +180,11 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe
tracks = await _trackDetailsEsRepository.GetDataByIds(@event.EsIds);
orderIds = tracks.Select(m => m.OrderId).Distinct().ToList();
@event.OrderIds = orderIds.ToArray();
- @event.TrackCodes = tracks.Select(x => x.TrackCode).Distinct().ToList();
+ @event.TrackIdentifiers = tracks.Select(x => new TrackIdentifierDto
+ {
+ TrackCode = x.TrackCode,
+ TrackTime = x.TrackTime
+ }).ToList();
// 外部api获取的轨迹不允许删除
if (tracks.Any(m => m.Source == TrackSourceEnum.ExternalServiceProvide.GetHashCode()))
@@ -189,11 +201,24 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe
}
else //原有逻辑,根据轨迹code和订单进行删除
{
+ var trackCodes = @event.TrackIdentifiers.Select(x => x.TrackCode).ToList();
// 删除轨迹(删的是同子系统下的单,所以code是统一的)
- tracks = await _trackDetailsEsRepository.GetLatestListAsync(@event.OrderIds, @event.TrackCodes);
+ tracks = await _trackDetailsEsRepository.GetListAsync(@event.OrderIds, trackCodes,null);
- orderIds = await _trackDetailsEsRepository.DeleteTrackAsync(@event.OrderIds, @event.TrackCodes);
- if (orderIds.Count == 0) return tracks;
+ //构建标识符集合
+ var ids = @event.TrackIdentifiers.Select(x => $"{x.TrackCode}{x.TrackTime}").ToList();
+ //根据标识符选出要删除的轨迹明细
+ var deleteTracks = tracks.Where(x => ids.Contains($"{x.TrackCode}{x.TrackTime}")).ToList();
+
+ if (deleteTracks.Count == 0) return deleteTracks;
+
+ foreach (var track in deleteTracks)
+ {
+ await _trackDetailsEsRepository.DeleteTrackByIdAsync(track.Id, track.IndexName);
+ }
+
+ orderIds = tracks.Select(m => m.OrderId).Distinct().ToList();
+ tracks = deleteTracks;
}
diff --git a/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs b/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs
index dea72486..c41d28c2 100644
--- a/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs
+++ b/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs
@@ -57,7 +57,7 @@ public partial class OrderService : ApplicationService, IOrderService
{
OrderId = order.Id,
OrderNo = input.OrderNo,
- OptionType = OrderOperationType.修改订单.ToString(),
+ OptionType = OrderOperationType.修改订单.ToString(),
Content = input.ToJson(),
CreateUserId = currentUser.UserId,
CreateUserName = currentUser.Name,
@@ -76,6 +76,7 @@ public partial class OrderService : ApplicationService, IOrderService
order.OrderFlights = ObjectMapper.Map, List>(input.FlightInfos);
order.OrderPullStatus = BuiltOrderPullStatus(input.PullConfigInfos);
order.OrderPlatformNumbers = BuiltOrderPlatformNumbers(input.PullConfigInfos);
+ order.TemplateCodes = string.Join(',', input.TemplateCodes);
var orderId = await _orderRepository.CreateOrderAsync(order);
diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs
index cec5feae..8023836a 100644
--- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs
+++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs
@@ -108,7 +108,7 @@ public partial class TrackService : ApplicationService, ITrackService
throw new BusinessException(message: $"订单:{input.OrderNo},轨迹代码:{input.TrackCode}存在多条记录,不允许修改");
}
- var userInfo = await _requestCurrentUserService.Service.GetCurrentUserBasicInfoAsync();
+ var userInfo = await _requestCurrentUserService.Service.GetCurrentUserBasicInfoAsync(input.OptionUserId);
if (userInfo.Code != GlobalConst.SuccessCode || userInfo.Data is null)
{
//TODO: log || ex
@@ -163,8 +163,14 @@ public partial class TrackService : ApplicationService, ITrackService
//删除轨迹约束,只要其中有一条来源是外部的就立即返回错误
var tracks = await _trackDetailsEsRepository
- .GetListAsync(new[] { orderId }, input.TrackCodes, TrackSourceEnum.ExternalServiceProvide);
- if (tracks.Count > 0)
+ .GetListAsync(new[] { orderId },
+ input.TrackIdentifiers.Select(x => x.TrackCode).ToList(),
+ TrackSourceEnum.ExternalServiceProvide);
+
+ //当要删除的轨迹标识出现交叉则不允许删除
+ var intersect = tracks.Select(x => $"{x.TrackCode}{x.TrackTime}")
+ .Intersect(input.TrackIdentifiers.Select(y => $"{y.TrackCode}{y.TrackTime}")).ToList();
+ if (intersect.Count > 0)
{
throw new BusinessException(message: "存在来源于外部服务商的轨迹,不允许删除");
}
@@ -173,7 +179,7 @@ public partial class TrackService : ApplicationService, ITrackService
var @event = new TrackDeleteEvent
{
OrderIds = new[] { orderId },
- TrackCodes = input.TrackCodes,
+ TrackIdentifiers = input.TrackIdentifiers,
SubSystemId = input.SubSystemId,
OperationMan = name
};
@@ -254,8 +260,14 @@ public partial class TrackService : ApplicationService, ITrackService
//删除轨迹约束,只要其中有一条来源是外部的就立即返回错误
var tracks = await _trackDetailsEsRepository
- .GetListAsync(orderIds.ToArray(), input.TrackCodes, TrackSourceEnum.ExternalServiceProvide);
- if (tracks.Count > 0)
+ .GetListAsync(orderIds.ToArray(),
+ input.TrackIdentifiers.Select(x => x.TrackCode).ToList(),
+ TrackSourceEnum.ExternalServiceProvide);
+
+ //当要删除的轨迹标识出现交叉则不允许删除
+ var intersect = tracks.Select(x => $"{x.TrackCode}{x.TrackTime}")
+ .Intersect(input.TrackIdentifiers.Select(y => $"{y.TrackCode}{y.TrackTime}")).ToList();
+ if (intersect.Count > 0)
{
throw new BusinessException(message: "存在来源于外部服务商的轨迹,不允许删除");
}
@@ -264,7 +276,7 @@ public partial class TrackService : ApplicationService, ITrackService
var @event = new TrackDeleteEvent
{
OrderIds = orderIds.ToArray(),
- TrackCodes = input.TrackCodes,
+ TrackIdentifiers = input.TrackIdentifiers,
SubSystemId = input.SubSystemId,
OperationMan = userInfo.Data.UserName,
};
diff --git a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs
index c7c69e68..c5e23f8d 100644
--- a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs
+++ b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs
@@ -2,6 +2,7 @@ using System.Linq.Expressions;
using Microsoft.Extensions.Localization;
using SJZY.Expand.ABP.Core.Localization;
using SJZY.Expand.ABP.Core.PublicMethords;
+using SJZY.Expand.AliyunOSS;
using SJZY.Track.Application.Contract.Dtos.ProvideServices;
using SJZY.Track.Application.Contract.Dtos.TrackContents;
using SJZY.Track.Application.Localization;
@@ -10,7 +11,9 @@ using SJZY.Track.Domain.Aggregates.TrackContentAggregate;
using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
using SJZY.Track.Domain.Aggregates.TrackFlagAggregate;
using SJZY.Track.Domain.Aggregates.TrackStatusAggregate;
+using SJZY.Track.Domain.Aggregates.TrackTemplateAggregate;
using SJZY.Track.Domain.Dtos.TrackContents;
+using SJZY.Track.Domain.Dtos.TrackTemplate;
using SJZY.Track.Domain.Queries;
namespace SJZY.Track.Application.Services.TrackContents;
@@ -24,6 +27,7 @@ public class TrackContentService : ApplicationService
{
private readonly IStringLocalizer _stringLocalizer;
private readonly ITrackContentRepository _trackContentRepository;
+ private readonly ITrackTemplateRepository _trackTemplateRepository;
private readonly IBasicQuery _trackFlagBasicQuery;
private readonly IBasicQuery _trackStatusBasicQuery;
private readonly IOrderRepository _orderRepository;
@@ -35,7 +39,8 @@ public class TrackContentService : ApplicationService
IBasicQuery trackStatusBasicQuery,
IBasicQuery trackFlagBasicQuery,
IOrderRepository orderRepository,
- ITrackDetailsEsRepository trackDetailsEsRepository)
+ ITrackDetailsEsRepository trackDetailsEsRepository,
+ ITrackTemplateRepository trackTemplateRepository)
{
_stringLocalizer = stringLocalizer;
_trackContentRepository = trackContentRepository;
@@ -43,6 +48,7 @@ public class TrackContentService : ApplicationService
_trackFlagBasicQuery = trackFlagBasicQuery;
_orderRepository = orderRepository;
_trackDetailsEsRepository = trackDetailsEsRepository;
+ _trackTemplateRepository = trackTemplateRepository;
}
///
@@ -220,6 +226,50 @@ public class TrackContentService : ApplicationService
return res;
}
+ ///
+ /// 根据子系统id、单号、订单类型、轨迹发生时间、轨迹code获取轨迹内容
+ ///
+ ///
+ ///
+ [HttpPost("GetContentDetail")]
+ public async Task> GetContentDetail([FromBody] GetContentDetailInput input)
+ {
+ if (input.SystemId <= 0)
+ return new UnifyResultDto(false, "子系统Id必须大于等于0");
+
+ if (string.IsNullOrEmpty(input.TrackCode))
+ return new UnifyResultDto(false, "轨迹内容code不能为空");
+
+ if (string.IsNullOrEmpty(input.OrderNumber))
+ return new UnifyResultDto(false, "订单code不能为空");
+
+ if (input.OrderType <= 0)
+ return new UnifyResultDto(false, "订单类型不能为空");
+
+ if (input.TrackTime == default)
+ return new UnifyResultDto(false, "轨迹发生时间不能为空");
+
+ var content = await _trackDetailsEsRepository.GetDetailAsync(input.OrderNumber, input.TrackCode, input.OrderType, input.SystemId, input.TrackTime);
+ if (content == default)
+ return new UnifyResultDto(false, "在当前子系统中未找到指定code的轨迹内容");
+
+ var res = new UnifyResultDto(true)
+ {
+ Data = ObjectMapper.Map(content)
+ };
+
+
+ if (res.Data != default && res.Data.Files.Any())
+ {
+ foreach (var item in res.Data.Files)
+ {
+ item.Url = OSSHelper.GetUrlByKey(item.OssKey);
+ }
+ }
+
+ return res;
+ }
+
///
/// 创建轨迹时获取可用的轨迹内容
///
@@ -235,18 +285,25 @@ public class TrackContentService : ApplicationService
return new UnifyResultDto>(false, "单号不能为空!");
//获取当前订单下已有的轨迹内容
- var orderId = await _orderRepository.GetFirstAsync(x => x.OrderNo == input.OrderNo && x.SubSystemId == input.SystemId, x => x.Id);
- if (orderId == default)
+ var order = await _orderRepository.GetFirstAsync(x => x.OrderNo == input.OrderNo && x.SubSystemId == input.SystemId);
+ if (order == default)
throw new BusinessException(message: "订单不存在!");
//获取轨迹详情
- var trackDetails = await _trackDetailsEsRepository.GetListAsync(orderId);
+ var trackDetails = await _trackDetailsEsRepository.GetListAsync(order.Id);
//获取当前子系统下所有的轨迹内容
var contentList = await _trackContentRepository.GetListBySystemIdAsync(input.SystemId);
if (contentList == null)
throw new BusinessException(message: "当前子系统下未找到任何可用的轨迹内容!");
+ //如果订单给了获取模板code,则进一步根据模板code进行过滤
+ if (!string.IsNullOrEmpty(order.TemplateCodes))
+ {
+ var currentCodes = order.TemplateCodes.Split(",");
+ var template = await _trackTemplateRepository.GetContentByTemplateCodes(currentCodes, input.SystemId);
+ contentList = contentList.Where(m => template.Contains(m.Code)).ToList();
+ }
var res = new UnifyResultDto>(true)
{
@@ -323,6 +380,12 @@ public class TrackContentService : ApplicationService
TrackPlaceCityId = matchItem.TrackPlaceCityId,
Remarks = matchItem.Remarks,
TrackTimeZoneValue = matchItem.DestinationTimeZone,
+ IsVisibility = matchItem.IsVisibility,
+ FileItems = matchItem.Files?.Select(x => new FileItemDto
+ {
+ FileName = x.FileName,
+ OssKey = x.OssKey
+ }).ToList()
});
matchContent.AddRange(match);
}
diff --git a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs
index b2e3a5ba..762c1324 100644
--- a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs
+++ b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs
@@ -180,6 +180,12 @@ public class OrderEntity : IFullAuditedBasicEntitys, IAggregateRoot
[SugarColumn(ColumnName = "DestinationTimeZone")]
public float? DestinationTimeZone { get; set; }
+ ///
+ /// 模板code
+ ///
+ [SugarColumn(ColumnName = "TemplateCodes")]
+ public string? TemplateCodes { get; set; }
+
[SugarColumn(IsIgnore = true)] public List OrderFlights { get; set; }
[SugarColumn(IsIgnore = true)] public List OrderPullStatus { get; set; }
diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs
index a8da5185..c57b797b 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.Dtos.TrackContents;
using SJZY.Track.Domain.Enums;
namespace SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
@@ -23,10 +24,11 @@ public interface ITrackDetailsEsRepository : IElasticsearchClientService> GetListAsync(int orderId);
- Task> GetListAsync(int[] orderIds, List trackCodes, TrackSourceEnum source);
+ Task> GetListAsync(int[] orderIds, List trackCodes, TrackSourceEnum? source);
Task> DeleteTrackAsync(int[] orderIds, List trackCodes);
Task DeleteTrackByIdAsync(string id, string indexName);
Task> GetDataByIds(string[] ids);
+ Task GetDetailAsync(string orderNo, string trackCode, int orderType, int subSystemId, DateTime trackTime);
}
diff --git a/src/SJZY.Track.Domain/Aggregates/TrackTemplateAggregate/ITrackTemplateRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackTemplateAggregate/ITrackTemplateRepository.cs
index 8a104c3c..db202083 100644
--- a/src/SJZY.Track.Domain/Aggregates/TrackTemplateAggregate/ITrackTemplateRepository.cs
+++ b/src/SJZY.Track.Domain/Aggregates/TrackTemplateAggregate/ITrackTemplateRepository.cs
@@ -45,4 +45,5 @@ public interface ITrackTemplateRepository : IBasicRepository> whereExpression);
Task> GetTrackTemplateListAsync(GetTrackTemplateListInputVo input);
+ Task> GetContentByTemplateCodes(string[] codes, int systemId);
}
diff --git a/src/SJZY.Track.Domain/Dtos/TrackContents/TrackCodeMapVO.cs b/src/SJZY.Track.Domain/Dtos/TrackContents/TrackCodeMapVO.cs
new file mode 100644
index 00000000..c06fc740
--- /dev/null
+++ b/src/SJZY.Track.Domain/Dtos/TrackContents/TrackCodeMapVO.cs
@@ -0,0 +1,27 @@
+namespace SJZY.Track.Domain.Dtos.TrackContents;
+
+///
+/// 轨迹代码映射
+///
+public sealed class TrackCodeMapVO
+{
+ ///
+ /// 源子系统id
+ ///
+ public int SubSystemId { get; set; }
+
+ ///
+ /// 源轨迹内容code
+ ///
+ public string TrackContentCode { get; set; } = null!;
+
+ ///
+ /// 映射子系统id
+ ///
+ public int MapSubSystemId { get; set; }
+
+ ///
+ /// 映射轨迹内容code
+ ///
+ public string MapTrackContentCode { get; set; } = null!;
+}
diff --git a/src/SJZY.Track.Domain/Queries/IProvideQueries.cs b/src/SJZY.Track.Domain/Queries/IProvideQueries.cs
index 60c0b330..351224c5 100644
--- a/src/SJZY.Track.Domain/Queries/IProvideQueries.cs
+++ b/src/SJZY.Track.Domain/Queries/IProvideQueries.cs
@@ -18,6 +18,14 @@ public interface IProvideQueries
///
Task> MapTrackCodesAsync(int upSubSystemId, int subSystemId, params string[] trackCodes);
+ ///
+ /// 获取子系统内容Code映射
+ ///
+ ///
+ ///
+ ///
+ ///
+ Task> GetTrackCodeMapsAsync(int upSubSystemId, int subSystemId, params string[] trackCodes);
///
/// 根据订单模板找对应服务商
///
diff --git a/src/SJZY.Track.Repository/Queries/ProvideQueries.cs b/src/SJZY.Track.Repository/Queries/ProvideQueries.cs
index 31855027..8dd6fc96 100644
--- a/src/SJZY.Track.Repository/Queries/ProvideQueries.cs
+++ b/src/SJZY.Track.Repository/Queries/ProvideQueries.cs
@@ -33,6 +33,22 @@ public class ProvideQueries : ISugarRepository, IProvideQueries, ITransientDepen
.ToListAsync();
}
+ public async Task> GetTrackCodeMapsAsync(int upSubSystemId, int subSystemId, params string[] trackCodes)
+ {
+ // 根据上游code得到下游code
+ return await Context.Queryable()
+ .Where(x => x.SubSystemId == subSystemId && x.MapSubSystemId == upSubSystemId &&
+ trackCodes.Contains(x.MapTrackContentCode))
+ .Select(x => new TrackCodeMapVO()
+ {
+ SubSystemId = x.SubSystemId,
+ TrackContentCode = x.TrackContentCode,
+ MapSubSystemId = x.MapSubSystemId,
+ MapTrackContentCode = x.MapTrackContentCode
+ })
+ .ToListAsync();
+ }
+
///
public async Task> FindOrderWithServiceProviderAsync(int subSystemId,
List orderNos)
@@ -46,7 +62,7 @@ public class ProvideQueries : ISugarRepository, IProvideQueries, ITransientDepen
.Select((a, b, c) => new OrderWithServiceProviderVO
{
//优先使用第三方的订单号,为空时才使用主单号
- OrderNo = b.OrderNo ?? a.OrderNo,
+ OrderNo = b.OrderNo.IsNullOrWhiteSpace() ? a.OrderNo : b.OrderNo!,
OrderType = a.OrderType,
SubSystemId = a.SubSystemId,
ServiceProviderCode = b.ServiceProviderCode,
@@ -67,7 +83,7 @@ public class ProvideQueries : ISugarRepository, IProvideQueries, ITransientDepen
.Select((a, b) => new OrderWithServiceProviderVO
{
//优先使用第三方的订单号,为空时才使用主单号
- OrderNo = b.OrderNo ?? a.OrderNo,
+ OrderNo = b.OrderNo.IsNullOrWhiteSpace() ? a.OrderNo : b.OrderNo!,
OrderType = a.OrderType,
SubSystemId = a.SubSystemId,
ServiceProviderCode = b.ServiceProviderCode
diff --git a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs
index 0fee4fc6..346d8c57 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.Dtos.TrackContents;
using SJZY.Track.Domain.Enums;
namespace SJZY.Track.Repository.Repositories;
@@ -75,6 +76,8 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract f.TrackTimeZone)
.Field(f => f.OrderId)
.Field(f => f.TrackCode)
+ .Field(f => f.Id)
+ .Field(f => f.IndexName)
))
.Query(q => q
.Bool(b => b
@@ -99,6 +102,17 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract so
.Field(f => f.ZeroTrackTime, SortOrder.Descending)
)
+ .Source(s2 => s2.Includes(fd2 => fd2
+ .Field(f => f.TrackEnContent)
+ .Field(f => f.TrackContent)
+ .Field(f => f.TrackPlace)
+ .Field(f => f.TrackTime)
+ .Field(f => f.TrackTimeZone)
+ .Field(f => f.OrderId)
+ .Field(f => f.TrackCode)
+ .Field(f => f.Id)
+ .Field(f => f.IndexName)
+ ))
)
)
)
@@ -343,15 +357,26 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract> GetListAsync(int[] orderIds, List trackCodes, TrackSourceEnum source)
+ public async Task> GetListAsync(int[] orderIds, List trackCodes, TrackSourceEnum? source)
{
+ var query = new QueryContainer();
+
+ if (orderIds.Length > 0)
+ {
+ query &= Query.Terms(t => t.Field(f => f.OrderId).Terms(orderIds));
+ }
+ if (trackCodes.Count > 0)
+ {
+ query &= Query.Terms(t => t.Field(f => f.TrackCode.Suffix("keyword")).Terms(trackCodes));
+ }
+ if (source.HasValue)
+ {
+ query &= Query.Term(t => t.Field(f => f.Source).Value(source.Value));
+ }
+
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)
- )
+ .Query(q => query)
.Size(SafelyLimit)
.Sort(s => s.Field(f => f.ZeroTrackTime, SortOrder.Descending)));
@@ -440,4 +465,38 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract GetDetailAsync(string orderNo, string trackCode, int orderType, int subSystemId, DateTime trackTime)
+ {
+ var res = await Context.SearchAsync(s => s
+ .Index("sjzy_track_details")
+ .Query(q => q
+ .Bool(b => b
+ .Must(mu => mu
+ .Terms(t => t
+ .Field(f => f.OrderNo.Suffix("keyword"))
+ .Terms(orderNo)),
+ mu => mu
+ .Terms(t => t
+ .Field(f => f.TrackCode.Suffix("keyword"))
+ .Terms(trackCode)),
+ mu => mu
+ .Terms(t => t
+ .Field(f => f.OrderType)
+ .Terms(orderType)),
+ mu => mu
+ .Terms(t => t
+ .Field(f => f.SubSystemId)
+ .Terms(subSystemId)),
+ mu => mu
+ .Terms(t => t
+ .Field(f => f.TrackTime)
+ .Terms(trackTime)) // 注意:这里你重复了OrderType的查询,你可能需要移除重复的查询
+ )
+ )
+ )
+ );
+
+ return res.Documents.FirstOrDefault();
+ }
}
diff --git a/src/SJZY.Track.Repository/Repositories/TrackTemplateRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackTemplateRepository.cs
index be08e964..9f28d8fc 100644
--- a/src/SJZY.Track.Repository/Repositories/TrackTemplateRepository.cs
+++ b/src/SJZY.Track.Repository/Repositories/TrackTemplateRepository.cs
@@ -8,6 +8,7 @@ using SJZY.Track.Domain.Aggregates.TrackTemplateAggregate;
using SJZY.Track.Domain.Dtos.TrackTemplate;
using SJZY.Track.Domain.Enums;
using SJZY.Track.Domain.VEntities;
+using SJZY.Expand.ABP.Core.SqlSugar.Tools;
namespace SJZY.Track.Repository.Repositories;
@@ -225,4 +226,26 @@ public class TrackTemplateRepository : BasicRepository, ITr
return templates;
}
+
+ public async Task> GetContentByTemplateCodes(string[] codes, int systemId)
+ {
+
+ var sql = @$"
+ select
+ distinct
+ c.Code
+ from t_track_template a
+ left join t_track_template_content b on a.id = b.TrackTemplateId and b.IsDeleted = 0
+ left join t_track_content c on b.TrackContentId = c.Id and c.IsDeleted = 0
+ where
+ a.SubSystemId = {systemId}
+ and a.Code in (@codes)
+ and a.IsDeleted = 0
+ ";
+
+
+ var list = Context.Ado.SqlQuery(sql, new {codes = codes}).ToList();
+
+ return list;
+ }
}