Merge branch 'S06' into test

This commit is contained in:
云龙 王 2024-12-04 17:34:35 +08:00
commit 525a372944
16 changed files with 193 additions and 29 deletions

View File

@ -0,0 +1,24 @@
namespace SJZY.Track.Application.Contract.Dtos.ProvideServices;
public class GetPageTrackTemplateListInput : PageInfoInput
{
/// <summary>
/// 子系统id
/// </summary>
public int SubSystemId { get; set; }
/// <summary>
/// 客户id
/// </summary>
public int? CustomerId { get; set; }
/// <summary>
/// 模版分类
/// </summary>
public int? TemplateType { get; set; }
/// <summary>
/// 模板code
/// </summary>
public string? TemplateCode { get; set; }
}

View File

@ -16,4 +16,9 @@ public class GetTrackTemplateListInput
/// 模版分类 /// 模版分类
/// </summary> /// </summary>
public int? TemplateType { get; set; } public int? TemplateType { get; set; }
/// <summary>
/// 模板code
/// </summary>
public string? TemplateCode { get; set; }
} }

View File

@ -21,11 +21,7 @@ public class OrderAutoMapperProfile : Profile
CreateMap<OrderFlightInfo, OrderFlightEntity>(MemberList.None); CreateMap<OrderFlightInfo, OrderFlightEntity>(MemberList.None);
CreateMap<GetPageTrackOrderInput, GetPageTrackOrderInputVO>(MemberList.None); CreateMap<GetPageTrackOrderInput, GetPageTrackOrderInputVO>(MemberList.None);
CreateMap<TrackOrderVO, TrackOrderDto>(MemberList.None) CreateMap<TrackOrderVO, TrackOrderDto>(MemberList.None);
.ForMember(dest => dest.OrderTypeName,
opt => opt.MapFrom(source => GetEnumDescription(2, source.OrderType)))
.ForMember(dest => dest.QuestionTypeName,
opt => opt.MapFrom(source => GetEnumDescription(1, source.QuestionType)));
CreateMap<UnifyPageResultDto<TrackOrderVO>, UnifyPageResultDto<TrackOrderDto>>(MemberList.None); CreateMap<UnifyPageResultDto<TrackOrderVO>, UnifyPageResultDto<TrackOrderDto>>(MemberList.None);
CreateMap<TrackDetailsIndex, TrackOrderDetailDto>(MemberList.None).Ignore(dest => dest.TrackTimeZone) CreateMap<TrackDetailsIndex, TrackOrderDetailDto>(MemberList.None).Ignore(dest => dest.TrackTimeZone)

View File

@ -20,6 +20,8 @@ public class TrackTemplateAutoMapperProfile : Profile
CreateMap<GetTrackTemplateListVO, GetTrackTemplateListDto>(MemberList.None); CreateMap<GetTrackTemplateListVO, GetTrackTemplateListDto>(MemberList.None);
CreateMap<UnifyPageResultDto<GetTrackTemplateListVO>, UnifyPageResultDto<GetTrackTemplateListDto>>(MemberList CreateMap<UnifyPageResultDto<GetTrackTemplateListVO>, UnifyPageResultDto<GetTrackTemplateListDto>>(MemberList
.None); .None);
CreateMap<GetPageTrackTemplateListInput, GetPageTrackTemplateListInputVo>(MemberList.None);
CreateMap<UnifyPageResultDto<TemplateContentDtoVo>, UnifyPageResultDto<TemplateContentDto>>(MemberList.None);
CreateMap<GetTrackTemplateListInput, GetTrackTemplateListInputVo>(MemberList.None); CreateMap<GetTrackTemplateListInput, GetTrackTemplateListInputVo>(MemberList.None);
CreateMap<TrackTemplateOutputVo, TrackTemplateOutput>(MemberList.None); CreateMap<TrackTemplateOutputVo, TrackTemplateOutput>(MemberList.None);

View File

@ -175,23 +175,27 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe
{ {
List<int> orderIds; List<int> orderIds;
List<TrackDetailsIndex> tracks; List<TrackDetailsIndex> tracks;
List<TrackDetailsIndex> deleteTracks;
if (@event.EsIds != null && @event.EsIds.Any()) //根据明确的esid进行删除 if (@event.EsIds != null && @event.EsIds.Any()) //根据明确的esid进行删除
{ {
tracks = await _trackDetailsEsRepository.GetDataByIds(@event.EsIds); deleteTracks = await _trackDetailsEsRepository.GetDataByIds(@event.EsIds);
orderIds = tracks.Select(m => m.OrderId).Distinct().ToList(); orderIds = deleteTracks.Select(m => m.OrderId).Distinct().ToList();
@event.OrderIds = orderIds.ToArray(); @event.OrderIds = orderIds.ToArray();
@event.TrackIdentifiers = tracks.Select(x => new TrackIdentifierDto @event.TrackIdentifiers = deleteTracks.Select(x => new TrackIdentifierDto
{ {
TrackCode = x.TrackCode, TrackCode = x.TrackCode,
TrackTime = x.TrackTime TrackTime = x.TrackTime
}).ToList(); }).ToList();
// 外部api获取的轨迹不允许删除 // 外部api获取的轨迹不允许删除
if (tracks.Any(m => m.Source == TrackSourceEnum.ExternalServiceProvide.GetHashCode())) if (deleteTracks.Any(m => m.Source == TrackSourceEnum.ExternalServiceProvide.GetHashCode()))
return tracks; return deleteTracks;
//查出订单下的所有轨迹,以供后面回退使用
tracks = await _trackDetailsEsRepository.GetListAsync(@event.OrderIds);
// 删除轨迹 // 删除轨迹
foreach (var item in tracks) foreach (var item in deleteTracks)
{ {
await _trackDetailsEsRepository.DeleteTrackByIdAsync(item.Id, item.IndexName); await _trackDetailsEsRepository.DeleteTrackByIdAsync(item.Id, item.IndexName);
} }
@ -205,9 +209,9 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe
tracks = await _trackDetailsEsRepository.GetListAsync(@event.OrderIds); tracks = await _trackDetailsEsRepository.GetListAsync(@event.OrderIds);
//构建标识符集合 //构建标识符集合
var ids = @event.TrackIdentifiers.Select(x => $"{x.TrackCode}{x.TrackTime}").ToList(); var ids = @event.TrackIdentifiers.Select(x => $"{x.TrackCode}{x.TrackTime:G}").ToList();
//根据标识符选出要删除的轨迹明细 //根据标识符选出要删除的轨迹明细
var deleteTracks = tracks.Where(x => ids.Contains($"{x.TrackCode}{x.TrackTime}")).ToList(); deleteTracks = tracks.Where(x => ids.Contains($"{x.TrackCode}{x.TrackTime:G}")).ToList();
if (deleteTracks.Count == 0) return deleteTracks; if (deleteTracks.Count == 0) return deleteTracks;
@ -218,10 +222,10 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe
//从被删除轨迹寻找订单id,稍后会更新订单主表 //从被删除轨迹寻找订单id,稍后会更新订单主表
orderIds = deleteTracks.Select(m => m.OrderId).Distinct().ToList(); orderIds = deleteTracks.Select(m => m.OrderId).Distinct().ToList();
//排除掉已经删除的轨迹
tracks = tracks.Except(deleteTracks).ToList();
} }
//排除掉已经删除的轨迹
tracks = tracks.Except(deleteTracks).ToList();
var orders = await _orderRepository.GetListAsync(x => orderIds.Contains(x.Id), var orders = await _orderRepository.GetListAsync(x => orderIds.Contains(x.Id),
x => new OrderEntity x => new OrderEntity
@ -232,6 +236,8 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe
LatestTrackPlace = x.LatestTrackPlace, LatestTrackPlace = x.LatestTrackPlace,
LatestTrackTime = x.LatestTrackTime, LatestTrackTime = x.LatestTrackTime,
LatestTrackTimeZone = x.LatestTrackTimeZone, LatestTrackTimeZone = x.LatestTrackTimeZone,
EstimatedDeliveryDate = x.EstimatedDeliveryDate,
DestinationTimeZone = x.DestinationTimeZone
}); });
if (orders.Count == 0) return tracks; if (orders.Count == 0) return tracks;
@ -258,6 +264,8 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe
order.LatestTrackPlace = track.TrackPlace; order.LatestTrackPlace = track.TrackPlace;
order.LatestTrackTime = track.TrackTime; order.LatestTrackTime = track.TrackTime;
order.LatestTrackTimeZone = track.TrackTimeZone; order.LatestTrackTimeZone = track.TrackTimeZone;
order.EstimatedDeliveryDate = track.EstimatedDeliveryDate;
order.DestinationTimeZone = track.DestinationTimeZone;
} }
@ -267,7 +275,7 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe
OrderId = order.Id, OrderId = order.Id,
OrderNo = order.OrderNo, OrderNo = order.OrderNo,
OptionType = OrderOperationType.删除轨迹.ToString(), OptionType = OrderOperationType.删除轨迹.ToString(),
Content = tracks?.Where(m => m.OrderId == order.Id).ToList().ToJson(), Content = deleteTracks?.Where(m => m.OrderId == order.Id).ToList().ToJson(),
CreateUserId = @event.OperationManId, CreateUserId = @event.OperationManId,
CreateUserName = @event.OperationMan ?? "", CreateUserName = @event.OperationMan ?? "",
CreateTime = DateTime.Now CreateTime = DateTime.Now
@ -281,9 +289,11 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe
x.LatestTrackEnContent, x.LatestTrackEnContent,
x.LatestTrackPlace, x.LatestTrackPlace,
x.LatestTrackTime, x.LatestTrackTime,
x.LatestTrackTimeZone x.LatestTrackTimeZone,
x.EstimatedDeliveryDate,
x.DestinationTimeZone
}); });
return tracks; return deleteTracks;
} }
} }

View File

@ -241,7 +241,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
TrackContent = trackContent.TrackContent, TrackContent = trackContent.TrackContent,
TrackEnContent = trackContent.TrackEnContent, TrackEnContent = trackContent.TrackEnContent,
TrackPlace = @event.TrackPlace, TrackPlace = @event.TrackPlace,
TrackTime = @event.TrackTime, TrackTime = @event.NewTrackTime ?? @event.TrackTime,
TrackTimeZone = @event.TrackTimeZone, TrackTimeZone = @event.TrackTimeZone,
DestinationTimeZone = @event.DestinationTimeZone, DestinationTimeZone = @event.DestinationTimeZone,
EstimatedDeliveryDate = @event.EstimatedDeliveryDate EstimatedDeliveryDate = @event.EstimatedDeliveryDate
@ -261,7 +261,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
TrackStatus = trackContent.TrackStatus, TrackStatus = trackContent.TrackStatus,
TrackContent = trackContent.TrackContent, TrackContent = trackContent.TrackContent,
TrackPlace = @event.TrackPlace, TrackPlace = @event.TrackPlace,
TrackTime = @event.TrackTime, TrackTime = @event.NewTrackTime ?? @event.TrackTime,
TrackTimeZone = @event.TrackTimeZone TrackTimeZone = @event.TrackTimeZone
} }
}; };

View File

@ -62,7 +62,7 @@ public partial class TrackService : ApplicationService, ITrackService
//要求时间在当前时间的前后100年之间内 //要求时间在当前时间的前后100年之间内
bool ValidateTrackTime(DateTime? d) => (d != null && d < DateTime.Now.AddYears(-100) || d > DateTime.Now.AddYears(100)); bool ValidateTrackTime(DateTime? d) => (d != null && d < DateTime.Now.AddYears(-100) || d > DateTime.Now.AddYears(100));
if (ValidateTrackTime(input.TrackTime) || ValidateTrackTime(input.NewTrackTime)) if (ValidateTrackTime(input.TrackTime) || ValidateTrackTime(input.NewTrackTime) || ValidateTrackTime(input.EstimatedDeliveryDate))
{ {
throw new BusinessException(message: "轨迹时间不合法"); throw new BusinessException(message: "轨迹时间不合法");
} }
@ -330,7 +330,7 @@ public partial class TrackService : ApplicationService, ITrackService
//要求时间在当前时间的前后100年之间内 //要求时间在当前时间的前后100年之间内
bool ValidateTrackTime(DateTime? d) => (d != null && d < DateTime.Now.AddYears(-100) || d > DateTime.Now.AddYears(100)); bool ValidateTrackTime(DateTime? d) => (d != null && d < DateTime.Now.AddYears(-100) || d > DateTime.Now.AddYears(100));
if (ValidateTrackTime(input.TrackTime) || ValidateTrackTime(input.NewTrackTime)) if (ValidateTrackTime(input.TrackTime) || ValidateTrackTime(input.NewTrackTime) || ValidateTrackTime(input.EstimatedDeliveryDate))
{ {
throw new BusinessException(message: "轨迹时间不合法"); throw new BusinessException(message: "轨迹时间不合法");
} }

View File

@ -33,4 +33,18 @@ public class TrackTemplateService : ApplicationService, ITrackTemplateService
var res = ObjectMapper.Map<List<TrackTemplateOutputVo>, List<TrackTemplateOutput>>(templates); var res = ObjectMapper.Map<List<TrackTemplateOutputVo>, List<TrackTemplateOutput>>(templates);
return res; return res;
} }
/// <summary>
/// 分页获取轨迹模版列表
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("Template/GetTrackTemplateListByPage")]
public async Task<UnifyPageResultDto<TemplateContentDto>> GetTrackTemplateListByPageAsync(GetPageTrackTemplateListInput input)
{
var inputVo = ObjectMapper.Map<GetPageTrackTemplateListInput, GetPageTrackTemplateListInputVo>(input);
var templates = await _trackTemplateRepository.GetPageTrackTemplateListAsync(inputVo);
var res = ObjectMapper.Map<UnifyPageResultDto<TemplateContentDtoVo>, UnifyPageResultDto<TemplateContentDto>>(templates);
return res;
}
} }

View File

@ -127,13 +127,13 @@ public class TrackOrderService : ApplicationService
if (whereExpression == default) if (whereExpression == default)
throw new BusinessException(message: "请求参数异常"); throw new BusinessException(message: "请求参数异常");
var subSystemId = await _orderRepository.GetFirstAsync(whereExpression, x => x.SubSystemId); var order = await _orderRepository.GetFirstAsync(whereExpression);
if (subSystemId == default) if (order == default)
{ {
throw new BusinessException(message: "订单不存在"); throw new BusinessException(message: "订单不存在");
} }
var trackDetails = await _trackDetailsEsRepository.GetListAsync(orderId ?? 0); var trackDetails = await _trackDetailsEsRepository.GetListAsync(order.Id);
if (trackDetails.IsNullOrEmpty()) if (trackDetails.IsNullOrEmpty())
{ {
return new List<TrackOrderDetailDto>(); return new List<TrackOrderDetailDto>();
@ -150,7 +150,7 @@ public class TrackOrderService : ApplicationService
if (!trackCodes.IsNullOrEmpty()) if (!trackCodes.IsNullOrEmpty())
{ {
var trackContents = await _trackContentRepository.GetListAsync(x => var trackContents = await _trackContentRepository.GetListAsync(x =>
x.SubSystemId == subSystemId && trackCodes.Contains(x.Code), x => new x.SubSystemId == order.SubSystemId && trackCodes.Contains(x.Code), x => new
{ {
x.Code, x.Code,
x.IsExternal x.IsExternal

View File

@ -201,5 +201,7 @@ public class OrderEntity : IFullAuditedBasicEntitys, IAggregateRoot
LatestTrackTime = null; LatestTrackTime = null;
LatestTrackPlace = null; LatestTrackPlace = null;
LatestTrackTimeZone = null; LatestTrackTimeZone = null;
EstimatedDeliveryDate = null;
DestinationTimeZone = null;
} }
} }

View File

@ -45,5 +45,6 @@ public interface ITrackTemplateRepository : IBasicRepository<TrackTemplateEntity
Expression<Func<TrackTemplateContentEntity, bool>> whereExpression); Expression<Func<TrackTemplateContentEntity, bool>> whereExpression);
Task<List<TrackTemplateOutputVo>> GetTrackTemplateListAsync(GetTrackTemplateListInputVo input); Task<List<TrackTemplateOutputVo>> GetTrackTemplateListAsync(GetTrackTemplateListInputVo input);
Task<UnifyPageResultDto<TemplateContentDtoVo>> GetPageTrackTemplateListAsync(GetPageTrackTemplateListInputVo input);
Task<List<string>> GetContentByTemplateCodes(string[] codes, int systemId); Task<List<string>> GetContentByTemplateCodes(string[] codes, int systemId);
} }

View File

@ -2,6 +2,8 @@ namespace SJZY.Track.Domain.Consts;
public partial class GlobalConst public partial class GlobalConst
{ {
public const string MainDataKey_OrderType = "TrackOrderType";
public const string MainDataKey_TrackQuestionType = "TrackQuestionType";
public const string SystemUser = "系统"; public const string SystemUser = "系统";
public const string EmptyString = "--"; public const string EmptyString = "--";
public const int ChunkSize = 100; public const int ChunkSize = 100;

View File

@ -0,0 +1,24 @@
namespace SJZY.Track.Domain.Dtos.TrackTemplate;
public class GetPageTrackTemplateListInputVo :PageInfoInput
{
/// <summary>
/// 子系统id
/// </summary>
public int SubSystemId { get; set; }
/// <summary>
/// 客户id
/// </summary>
public int? CustomerId { get; set; }
/// <summary>
/// 模版分类
/// </summary>
public int? TemplateType { get; set; }
/// <summary>
/// 模板code
/// </summary>
public string? TemplateCode { get; set; }
}

View File

@ -16,4 +16,9 @@ public class GetTrackTemplateListInputVo
/// 模版分类 /// 模版分类
/// </summary> /// </summary>
public int? TemplateType { get; set; } public int? TemplateType { get; set; }
/// <summary>
/// 模板code
/// </summary>
public string? TemplateCode { get; set; }
} }

View File

@ -1,3 +1,4 @@
using NUglify.Helpers;
using SJZY.Expand.ABP.Core.Logger; using SJZY.Expand.ABP.Core.Logger;
using SJZY.Track.Domain; using SJZY.Track.Domain;
using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.OrderAggregate;
@ -55,6 +56,45 @@ public class OrderRepository : BasicRepository<OrderEntity>, IOrderRepository, I
}) })
.ToPagedListAsync(input.PageIndex, input.PageSize); .ToPagedListAsync(input.PageIndex, input.PageSize);
//查询订单类型描述
var orderTypes = pageList.List.Select(x => x.OrderType).Distinct().ToList();
var questTypes = pageList.List.Select(x => x.QuestionType).Distinct().ToList();
//从主数据中心查询类型描述
var typeDispDict = (await Context.Queryable<VEnumValueInfoEntity>()
.Where(x =>
(x.Property == GlobalConst.MainDataKey_OrderType && orderTypes.Contains(x.Enumkey))
|| (x.Property == GlobalConst.MainDataKey_TrackQuestionType && questTypes.Contains(x.Enumkey))
)
.Select(x => new
{
x.Property,
x.Enumkey,
x.Disp
})
.ToListAsync()
)
.GroupBy(x => x.Property)
.ToDictionary(
g => g.Key,
y => y.ToDictionary(x => x.Enumkey, x => x.Disp)
);
//填充数描述信息
pageList.List.ForEach(x =>
{
x.OrderTypeName = typeDispDict.TryGetValue(GlobalConst.MainDataKey_OrderType, out var orderTypeDisplayDict)
? orderTypeDisplayDict.TryGetValue(x.OrderType, out var orderTypeDisplay)
? orderTypeDisplay
: $"未在主数据中心找到Property:[{GlobalConst.MainDataKey_OrderType}] Enumkey:[{x.OrderType}]"
: $"未在主数据中心找到Property:[{GlobalConst.MainDataKey_OrderType}]";
x.QuestionTypeName = typeDispDict.TryGetValue(GlobalConst.MainDataKey_TrackQuestionType, out var questDisplayDict)
? questDisplayDict.TryGetValue(x.QuestionType, out var questDisplay)
? questDisplay
: $"未在主数据中心找到Property:[{GlobalConst.MainDataKey_OrderType}] Enumkey:[{x.OrderType}]"
: $"未在主数据中心找到Property:[{GlobalConst.MainDataKey_TrackQuestionType}]";
});
return pageList; return pageList;
} }

View File

@ -191,6 +191,7 @@ public class TrackTemplateRepository : BasicRepository<TrackTemplateEntity>, ITr
.Where(x => x.SubSystemId == input.SubSystemId) .Where(x => x.SubSystemId == input.SubSystemId)
.WhereIF(input.CustomerId.HasValue, x => x.CustomerId == input.CustomerId) .WhereIF(input.CustomerId.HasValue, x => x.CustomerId == input.CustomerId)
.WhereIF(input.TemplateType.HasValue, x => x.CategoryId == input.TemplateType) .WhereIF(input.TemplateType.HasValue, x => x.CategoryId == input.TemplateType)
.WhereIF(!input.TemplateCode.IsNullOrWhiteSpace(), x => x.Code == input.TemplateCode)
.Select(x => new TrackTemplateOutputVo .Select(x => new TrackTemplateOutputVo
{ {
Id = x.Id, Id = x.Id,
@ -227,9 +228,44 @@ public class TrackTemplateRepository : BasicRepository<TrackTemplateEntity>, ITr
return templates; return templates;
} }
public async Task<UnifyPageResultDto<TemplateContentDtoVo>> GetPageTrackTemplateListAsync(GetPageTrackTemplateListInputVo input)
{
var templates = await Context.Queryable<TrackTemplateEntity>()
.Where(x => x.SubSystemId == input.SubSystemId)
.WhereIF(input.CustomerId.HasValue, x => x.CustomerId == input.CustomerId)
.WhereIF(input.TemplateType.HasValue, x => x.CategoryId == input.TemplateType)
.WhereIF(!input.TemplateCode.IsNullOrWhiteSpace(), x => x.Code == input.TemplateCode)
.Select(x => new TrackTemplateOutputVo
{
Id = x.Id,
TemplateName = x.Name,
TemplateCode = x.Code,
})
.ToListAsync();
if (templates == default) return new UnifyPageResultDto<TemplateContentDtoVo>();
var templateIds = templates.Select(x => x.Id).ToArray();
var contents = await Context.Queryable<TrackTemplateContentEntity>()
.LeftJoin<TrackContentEntity>((a, b) => a.TrackContentId == b.Id)
.LeftJoin<TrackStatusEntity>((a, b, c) => b.TrackStatusId == c.Id)
.LeftJoin<TrackNodeEntity>((a, b, c, d) => c.Node == d.Id)
.Where(a => templateIds.Contains(a.TrackTemplateId))
.Select((a, b, c, d) => new TemplateContentDtoVo
{
TemplateId = a.TrackTemplateId,
Code = b.Code,
ContentCn = b.Content,
ContentEn = b.EnContent,
Status = c.Status,
Node = d.NodeName
})
.ToPagedListAsync(input.PageIndex, input.PageSize);
return contents;
}
public async Task<List<string>> GetContentByTemplateCodes(string[] codes, int systemId) public async Task<List<string>> GetContentByTemplateCodes(string[] codes, int systemId)
{ {
var sql = @$" var sql = @$"
select select
distinct distinct
@ -244,7 +280,10 @@ public class TrackTemplateRepository : BasicRepository<TrackTemplateEntity>, ITr
"; ";
var list = Context.Ado.SqlQuery<string>(sql, new {codes = codes}).ToList(); var list = Context.Ado.SqlQuery<string>(sql, new
{
codes = codes
}).ToList();
return list; return list;
} }