Merge branch 'S01-轨迹中台' into test

This commit is contained in:
李鹏军 2024-03-05 11:49:39 +08:00
commit 8b570a7462
11 changed files with 76 additions and 41 deletions

View File

@ -8,6 +8,7 @@ public class OrderNoInfo
/// 订单类型,必填 /// 订单类型,必填
/// </summary> /// </summary>
[Required] [Required]
[Range(1, int.MaxValue)]
public int OrderType { get; set; } public int OrderType { get; set; }
/// <summary> /// <summary>

View File

@ -1,4 +1,6 @@
namespace SJZY.Track.Application.Contract.Dtos.ProvideServices; using System.ComponentModel.DataAnnotations;
namespace SJZY.Track.Application.Contract.Dtos.ProvideServices;
public class UpdateOrderInput : OrderNoInfo public class UpdateOrderInput : OrderNoInfo
{ {
@ -15,30 +17,38 @@ public class UpdateOrderInput : OrderNoInfo
/// <summary> /// <summary>
/// 目的国家,必填 /// 目的国家,必填
/// </summary> /// </summary>
public string ArrivalCountry { get; set; } [Required]
[MaxLength(200)]
public string ArrivalCountry { get; set; } = null!;
/// <summary> /// <summary>
/// 起运国家,必填 /// 起运国家,必填
/// </summary> /// </summary>
public string LeaveCountry { get; set; } [Required]
[MaxLength(200)]
public string LeaveCountry { get; set; } = null!;
/// <summary> /// <summary>
/// 目的城市,必填 /// 目的城市,必填
/// </summary> /// </summary>
public string ArrivalCity { get; set; } [Required]
[MaxLength(200)]
public string ArrivalCity { get; set; } = null!;
/// <summary> /// <summary>
/// 起运城市,必填 /// 起运城市,必填
/// </summary> /// </summary>
public string LeaveCity { get; set; } [Required]
[MaxLength(200)]
public string LeaveCity { get; set; } = null!;
/// <summary> /// <summary>
/// 订单模板(传全量) /// 订单模板(传全量)
/// </summary> /// </summary>
public List<OrderTemplateInfo> Templates { get; set; } = new(); public List<OrderTemplateInfo>? Templates { get; set; } = new();
/// <summary> /// <summary>
/// 订单航班信息 /// 订单航班信息
/// </summary> /// </summary>
public List<OrderFligthInfo> FlightInfos { get; set; } = new(); public List<OrderFlightInfo>? FlightInfos { get; set; } = new();
} }

View File

@ -24,7 +24,7 @@ public class OrderTemplateInfo
public int? ServiceProviderId { get; set; } public int? ServiceProviderId { get; set; }
} }
public class OrderFligthInfo public class OrderFlightInfo
{ {
/// <summary> /// <summary>
/// 航班号 /// 航班号

View File

@ -1,24 +1,32 @@
namespace SJZY.Track.Application.Contract.Dtos.ProvideServices; using System.ComponentModel.DataAnnotations;
namespace SJZY.Track.Application.Contract.Dtos.ProvideServices;
public class UpsertTrackInput : OrderNoInfo public class UpsertTrackInput : OrderNoInfo
{ {
/// <summary> /// <summary>
/// 轨迹内容代码 /// 轨迹内容代码
/// </summary> /// </summary>
[Required]
[MaxLength(50)]
public string TrackCode { get; set; } = null!; public string TrackCode { get; set; } = null!;
/// <summary> /// <summary>
/// 轨迹发生地 /// 轨迹发生地
/// </summary> /// </summary>
[Required]
[MaxLength(200)]
public string TrackPlace { get; set; } = null!; public string TrackPlace { get; set; } = null!;
/// <summary> /// <summary>
/// 轨迹发生时间 /// 轨迹发生时间
/// </summary> /// </summary>
[Required]
public DateTime TrackTime { get; set; } public DateTime TrackTime { get; set; }
/// <summary> /// <summary>
/// 轨迹发生时区 /// 轨迹发生时区
/// </summary> /// </summary>
[Required]
public float TraceTimeZone { get; set; } public float TraceTimeZone { get; set; }
} }

View File

@ -1,10 +1,8 @@
using AutoMapper; using AutoMapper;
using AutoMapper.Internal.Mappers;
using SJZY.Track.Application.Contract.Dtos.ProvideServices; using SJZY.Track.Application.Contract.Dtos.ProvideServices;
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.Order; using SJZY.Track.Domain.Dtos.Order;
using System.Diagnostics;
namespace SJZY.Track.Application.AutoMapper; namespace SJZY.Track.Application.AutoMapper;
@ -18,7 +16,7 @@ public class OrderAutoMapperProfile : Profile
CreateMap<OrderTemplateInfo, OrderTemplateEntity>(MemberList.None) CreateMap<OrderTemplateInfo, OrderTemplateEntity>(MemberList.None)
.ForMember(dest => dest.ServiceProviderId, opt => opt.MapFrom(m => m.ServiceProviderId ?? 0)) .ForMember(dest => dest.ServiceProviderId, opt => opt.MapFrom(m => m.ServiceProviderId ?? 0))
.ForMember(dest => dest.TrackTemplateId, opt => opt.MapFrom(m => m.TemplateId)); .ForMember(dest => dest.TrackTemplateId, opt => opt.MapFrom(m => m.TemplateId));
CreateMap<OrderFligthInfo, 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);

View File

@ -43,8 +43,8 @@ public class OrderService : ApplicationService
order = ObjectMapper.Map<UpsertOrderInput, OrderEntity>(input); order = ObjectMapper.Map<UpsertOrderInput, OrderEntity>(input);
order.SubSystemId = 1; order.SubSystemId = 1;
order.OrderTemplates = ObjectMapper.Map<List<OrderTemplateInfo>, List<OrderTemplateEntity>>(input.Templates); order.OrderTemplates = ObjectMapper.Map<List<OrderTemplateInfo>, List<OrderTemplateEntity>>(input.Templates!);
order.OrderFlights = ObjectMapper.Map<List<OrderFligthInfo>, List<OrderFlightEntity>>(input.FlightInfos); order.OrderFlights = ObjectMapper.Map<List<OrderFlightInfo>, List<OrderFlightEntity>>(input.FlightInfos!);
await _orderRepository.CreateOrderAsync(order); await _orderRepository.CreateOrderAsync(order);
return "创建成功"; return "创建成功";
@ -94,6 +94,7 @@ public class OrderService : ApplicationService
#endregion #endregion
#region 轨迹订单列表 #region 轨迹订单列表
/// <summary> /// <summary>
/// 获取分页的轨迹订单 /// 获取分页的轨迹订单
/// </summary> /// </summary>
@ -108,13 +109,14 @@ public class OrderService : ApplicationService
ObjectMapper.Map<UnifyPageResultDto<TrackOrderVO>, UnifyPageResultDto<TrackOrderDto>>(pageList); ObjectMapper.Map<UnifyPageResultDto<TrackOrderVO>, UnifyPageResultDto<TrackOrderDto>>(pageList);
return pageResultDto; return pageResultDto;
} }
#endregion #endregion
private async Task UpdateOrderAsync(UpdateOrderInput input, OrderEntity order) private async Task UpdateOrderAsync(UpdateOrderInput input, OrderEntity order)
{ {
order = ObjectMapper.Map(input, order); order = ObjectMapper.Map(input, order);
order.OrderTemplates = ObjectMapper.Map<List<OrderTemplateInfo>, List<OrderTemplateEntity>>(input.Templates); order.OrderTemplates = ObjectMapper.Map<List<OrderTemplateInfo>, List<OrderTemplateEntity>>(input.Templates);
order.OrderFlights = ObjectMapper.Map<List<OrderFligthInfo>, List<OrderFlightEntity>>(input.FlightInfos); order.OrderFlights = ObjectMapper.Map<List<OrderFlightInfo>, List<OrderFlightEntity>>(input.FlightInfos);
await _orderRepository.UpdateOrderAsync(order); await _orderRepository.UpdateOrderAsync(order);
} }
} }

View File

@ -1,4 +1,5 @@
using System.Linq.Expressions; using System;
using System.Linq.Expressions;
using Microsoft.Extensions.Localization; using Microsoft.Extensions.Localization;
using SJZY.Expand.ABP.Core.Localization; using SJZY.Expand.ABP.Core.Localization;
using SJZY.Expand.ABP.Core.PublicMethords; using SJZY.Expand.ABP.Core.PublicMethords;
@ -211,18 +212,22 @@ public class TrackPullService : ApplicationService, ITransientDependency
{ {
Expression<Func<TrackPullContentConfigEntity, bool>> isContentAnyExp = x => x.Id != input.Id && x.TrackPullConfigId == input.TrackPullConfigId; Expression<Func<TrackPullContentConfigEntity, bool>> isContentAnyExp = x => x.Id != input.Id && x.TrackPullConfigId == input.TrackPullConfigId;
var trackKeywordExp = Expressionable.Create<TrackPullContentConfigEntity>() if (await _trackPullConfigRepository.IsContentAnyAsync(isContentAnyExp.And(x => x.TrackContentId == input.TrackContentId)))
.And(x => x.TrackContentId == input.TrackContentId
|| (input.TrackContentCodeValue != null && x.TrackContentCodeValue == input.TrackContentCodeValue)
|| (input.TrackStatusValue != null && x.TrackStatusValue == input.TrackStatusValue)
|| (input.TrackContentValue != null && x.TrackContentValue == input.TrackContentValue));
input.TrackKeywords?.ForEach(item => { trackKeywordExp.Or(x => SqlFunc.SplitIn(x.TrackKeyword, item)); });
isContentAnyExp = isContentAnyExp.And(trackKeywordExp.ToExpression());
if (await _trackPullConfigRepository.IsContentAnyAsync(isContentAnyExp))
throw new BusinessException(message: _stringLocalizer["IsTrackPullContentAny"]); throw new BusinessException(message: _stringLocalizer["IsTrackPullContentAny"]);
else if (!input.TrackContentCodeValue.IsNullOrWhiteSpace() && await _trackPullConfigRepository.IsContentAnyAsync(isContentAnyExp.And(x => x.TrackContentCodeValue == input.TrackContentCodeValue)))
throw new BusinessException(message: _stringLocalizer["IsTrackPullContentCodeValueAny"]);
else if (!input.TrackStatusValue.IsNullOrWhiteSpace() && await _trackPullConfigRepository.IsContentAnyAsync(isContentAnyExp.And(x => x.TrackStatusValue == input.TrackStatusValue)))
throw new BusinessException(message: _stringLocalizer["IsTrackPullContentStatusValueAny"]);
else if (!input.TrackContentValue.IsNullOrWhiteSpace() && await _trackPullConfigRepository.IsContentAnyAsync(isContentAnyExp.And(x => x.TrackContentValue == input.TrackContentValue)))
throw new BusinessException(message: _stringLocalizer["IsTrackPullContentValueAny"]);
else if (!input.TrackKeywords.IsNullOrEmpty())
{
Expression<Func<TrackPullContentConfigEntity, bool>> trackKeywordExp = _ => true;
input.TrackKeywords!.ForEach(item => { trackKeywordExp = trackKeywordExp.Or(x => SqlFunc.SplitIn(x.TrackKeyword, item)); });
if (await _trackPullConfigRepository.IsContentAnyAsync(isContentAnyExp.And(trackKeywordExp)))
throw new BusinessException(message: _stringLocalizer["IsTrackPullContentKeywordsAny"]);
}
var oldTrackPullContentEntity = await _trackPullConfigRepository.GetContentByIdAsync(input.Id) ?? var oldTrackPullContentEntity = await _trackPullConfigRepository.GetContentByIdAsync(input.Id) ??
throw new BusinessException(message: _stringLocalizer["NotFindData"]); throw new BusinessException(message: _stringLocalizer["NotFindData"]);

View File

@ -111,7 +111,7 @@ public class TrackPushService : ApplicationService, ITransientDependency
if (input.Options == OptionTypeNoNull.修改) isAnyExp = isAnyExp.And(x => x.Id != input.Id); if (input.Options == OptionTypeNoNull.修改) isAnyExp = isAnyExp.And(x => x.Id != input.Id);
var trackTemplateIdExp = Expressionable.Create<TrackPushConfigEntity>(); var trackTemplateIdExp = Expressionable.Create<TrackPushConfigEntity>();
foreach (var trackTemplateId in input.TrackTemplateIds) { trackTemplateIdExp.Or(x => SqlFunc.SplitIn(x.TrackTemplateId, trackTemplateId.ToString())); } input.TrackTemplateIds?.ForEach(item => { trackTemplateIdExp.Or(x => SqlFunc.SplitIn(x.TrackTemplateId, item.ToString())); });
isAnyExp = isAnyExp.And(trackTemplateIdExp.ToExpression()); isAnyExp = isAnyExp.And(trackTemplateIdExp.ToExpression());
@ -202,17 +202,19 @@ public class TrackPushService : ApplicationService, ITransientDependency
{ {
if (input.Options != OptionTypeNoNull.删除) if (input.Options != OptionTypeNoNull.删除)
{ {
Expression<Func<TrackPushContentConfigEntity, bool>> isContentAnyExp = x => Expression<Func<TrackPushContentConfigEntity, bool>> isContentAnyExp = x => x.TrackPushConfigId == input.TrackPushConfigId;
x.TrackPushConfigId == input.TrackPushConfigId
&& (x.TrackContentId == input.TrackContentId
|| (input.TrackContentCodeValue != null && x.TrackContentCodeValue == input.TrackContentCodeValue)
|| (input.TrackStatusValue != null && x.TrackStatusValue == input.TrackStatusValue)
|| (input.TrackContentValue != null && x.TrackContentValue == input.TrackContentValue)
|| (input.TrackEnContentValue != null && x.TrackEnContentValue == input.TrackEnContentValue));
if (input.Options == OptionTypeNoNull.修改) isContentAnyExp = isContentAnyExp.And(x => x.Id != input.Id); if (input.Options == OptionTypeNoNull.修改) isContentAnyExp = isContentAnyExp.And(x => x.Id != input.Id);
if (await _trackPushConfigRepository.IsContentAnyAsync(isContentAnyExp)) if (await _trackPushConfigRepository.IsContentAnyAsync(isContentAnyExp.And(x => x.TrackContentId == input.TrackContentId)))
throw new BusinessException(message: _stringLocalizer["IsTrackPushContentAny"]); throw new BusinessException(message: _stringLocalizer["IsTrackPushContentAny"]);
else if (!input.TrackContentCodeValue.IsNullOrWhiteSpace() && await _trackPushConfigRepository.IsContentAnyAsync(isContentAnyExp.And(x => x.TrackContentCodeValue == input.TrackContentCodeValue)))
throw new BusinessException(message: _stringLocalizer["IsTrackPushContentCodeValueAny"]);
else if (!input.TrackStatusValue.IsNullOrWhiteSpace() && await _trackPushConfigRepository.IsContentAnyAsync(isContentAnyExp.And(x => x.TrackStatusValue == input.TrackStatusValue)))
throw new BusinessException(message: _stringLocalizer["IsTrackPushContentStatusValueAny"]);
else if (!input.TrackContentValue.IsNullOrWhiteSpace() && await _trackPushConfigRepository.IsContentAnyAsync(isContentAnyExp.And(x => x.TrackContentValue == input.TrackContentValue)))
throw new BusinessException(message: _stringLocalizer["IsTrackPushContentValueAny"]);
else if (!input.TrackEnContentValue.IsNullOrWhiteSpace() && await _trackPushConfigRepository.IsContentAnyAsync(isContentAnyExp.And(x => x.TrackEnContentValue == input.TrackEnContentValue)))
throw new BusinessException(message: _stringLocalizer["IsTrackPushEnContentValueAny"]);
} }
switch (input.Options) switch (input.Options)

View File

@ -47,7 +47,7 @@ public class GetTrackPushContentDetailOutputVO
/// <summary> /// <summary>
/// 轨迹推送配置id /// 轨迹推送配置id
/// </summary> /// </summary>
public int TrackPullConfigId { get; set; } public int TrackPushConfigId { get; set; }
/// <summary> /// <summary>
/// 推送轨迹状态 /// 推送轨迹状态

View File

@ -11,4 +11,9 @@ public enum EnumPropertyEnums
/// 节点 /// 节点
/// </summary> /// </summary>
[Description("ServiceNode")] 节点, [Description("ServiceNode")] 节点,
/// <summary>
/// 单号类型
/// </summary>
[Description("TrackOrderType")] 单号类型
} }

View File

@ -1,9 +1,11 @@
using SJZY.Track.Domain.Aggregates.TrackContentAggregate; using SJZY.Expand.ABP.Core.PublicMethords;
using SJZY.Track.Domain.Aggregates.TrackContentAggregate;
using SJZY.Track.Domain.Aggregates.TrackPullAggregate; using SJZY.Track.Domain.Aggregates.TrackPullAggregate;
using SJZY.Track.Domain.Aggregates.TrackPushAggregate; using SJZY.Track.Domain.Aggregates.TrackPushAggregate;
using SJZY.Track.Domain.Aggregates.TrackTemplateAggregate; using SJZY.Track.Domain.Aggregates.TrackTemplateAggregate;
using SJZY.Track.Domain.Dtos.Common; using SJZY.Track.Domain.Dtos.Common;
using SJZY.Track.Domain.Dtos.TrackPush; using SJZY.Track.Domain.Dtos.TrackPush;
using SJZY.Track.Domain.Enums;
using SJZY.Track.Domain.VEntities; using SJZY.Track.Domain.VEntities;
using SJZY.Track.Repository.VData.Entitys; using SJZY.Track.Repository.VData.Entitys;
using System.Linq.Expressions; using System.Linq.Expressions;
@ -44,12 +46,14 @@ public class TrackPushConfigRepository : BasicRepository<TrackPushConfigEntity>,
{ {
return await Context.Queryable<TrackPushContentConfigEntity>() return await Context.Queryable<TrackPushContentConfigEntity>()
.InnerJoin<TrackContentEntity>((pushContent, trackContent) => pushContent.TrackContentId == trackContent.Id) .InnerJoin<TrackContentEntity>((pushContent, trackContent) => pushContent.TrackContentId == trackContent.Id)
.LeftJoin<VEnumValueInfoEntity>((pushContent, trackContent, enumValue) => enumValue.Property == EnumPropertyEnums.单号类型.GetDescription() && pushContent.OrderNoType == enumValue.Enumkey && !enumValue.IsDeleted)
.Where(pushContent => pushContent.TrackPushConfigId == input.TrackPushConfigId) .Where(pushContent => pushContent.TrackPushConfigId == input.TrackPushConfigId)
.OrderBy((pushContent, trackContent) => pushContent.Sort) .OrderBy(pushContent => pushContent.Sort)
.Select((pushContent, trackContent) => new GetTrackPushContentPageOutputVO .Select((pushContent, trackContent, enumValue) => new GetTrackPushContentPageOutputVO
{ {
Id = pushContent.Id, Id = pushContent.Id,
Sort = pushContent.Sort Sort = pushContent.Sort,
OrderNoType = enumValue.Disp
}, true) }, true)
.ToPagedListAsync(input.PageIndex, input.PageSize); .ToPagedListAsync(input.PageIndex, input.PageSize);
} }