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

This commit is contained in:
moyongzhen 2024-03-01 09:11:56 +08:00
commit 7a58d3d963
35 changed files with 661 additions and 229 deletions

View File

@ -3,6 +3,7 @@ using AutoMapper.Internal.Mappers;
using SJZY.Track.Application.Dtos.ProvideServices; using SJZY.Track.Application.Dtos.ProvideServices;
using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.OrderAggregate;
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;
@ -10,15 +11,16 @@ public class OrderAutoMapperProfile : Profile
{ {
public OrderAutoMapperProfile() public OrderAutoMapperProfile()
{ {
CreateMap<CreateOrderInput, OrderEntity>(MemberList.None); CreateMap<UpsertOrderInput, OrderEntity>(MemberList.None);
CreateMap<UpdateOrderInput, OrderEntity>(MemberList.None); CreateMap<UpdateOrderInput, OrderEntity>(MemberList.None);
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<OrderFligthInfo, OrderFlightEntity>(MemberList.None);
CreateMap<GetPageTrackOrderInput, GetPageTrackOrderInputVO>(MemberList.None);
CreateMap<GetPageTrackOrderInput, GetPageTrackOrderInputVO>(MemberList.None);
CreateMap<TrackOrderVO, TrackOrderDto>(MemberList.None);
CreateMap<UnifyPageResultDto<TrackOrderVO>, UnifyPageResultDto<TrackOrderDto>>(MemberList.None);
} }
} }

View File

@ -1,23 +1,5 @@
using System.ComponentModel.DataAnnotations; namespace SJZY.Track.Application.Dtos.ProvideServices;
namespace SJZY.Track.Application.Dtos.ProvideServices;
public class DeleteOrderInput : OrderNoInfo public class DeleteOrderInput : OrderNoInfo
{ {
}
public class OrderNoInfo
{
/// <summary>
/// 订单类型,必填
/// </summary>
[Required]
public int OrderType { get; set; }
/// <summary>
/// 订单号,必填
/// </summary>
[Required]
[MaxLength(100)]
public string OrderNo { get; set; } = null!;
} }

View File

@ -26,7 +26,7 @@ namespace SJZY.Track.Application.Dtos.ProvideServices
/// <summary> /// <summary>
/// 创建时间截止 /// 创建时间截止
/// </summary> /// </summary>
public DateTime? createTimeEnd { get; set; } public DateTime? CreateTimeEnd { get; set; }
} }
/// <summary> /// <summary>
@ -40,11 +40,63 @@ namespace SJZY.Track.Application.Dtos.ProvideServices
public int Id { get; set; } public int Id { get; set; }
/// <summary> /// <summary>
/// 订单类型 /// 订单类型id
/// </summary> /// </summary>
public string OrderType { get; set; } public int OrderType { get; set; }
/// <summary>
/// 订单号
/// </summary>
public string? OrderNumber { get; set; }
public string OrderNumber { get; set; } /// <summary>
/// 轨迹模版
/// </summary>
public string? TrackTemplateNames { get; set; }
/// <summary>
/// 客户简称
/// </summary>
public string? CustomerShortName { get; set; }
/// <summary>
/// 客户代码
/// </summary>
public string? CustomerCode { get; set; }
/// <summary>
/// 订单明细(json)
/// </summary>
public string? OrderDetails { get; set; }
/// <summary>
/// 最新轨迹内容
/// </summary>
public string? NewestTrackContent { get; set; }
/// <summary>
/// 最新轨迹内容英文
/// </summary>
public string? NewestTrackEnContent { get; set; }
/// <summary>
/// 最新轨迹发生地
/// </summary>
public string? NewestTrackPlace { get; set; }
/// <summary>
/// 是否完结
/// </summary>
public bool IsFinish { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime? CreateTime { get; set; }
/// <summary>
/// 子系统
/// </summary>
public string SubSystem { get; set; }
} }
} }

View File

@ -0,0 +1,19 @@
using System.ComponentModel.DataAnnotations;
namespace SJZY.Track.Application.Dtos.ProvideServices;
public class OrderNoInfo
{
/// <summary>
/// 订单类型,必填
/// </summary>
[Required]
public int OrderType { get; set; }
/// <summary>
/// 订单号,必填
/// </summary>
[Required]
[MaxLength(100)]
public string OrderNo { get; set; } = null!;
}

View File

@ -2,7 +2,7 @@
namespace SJZY.Track.Application.Dtos.ProvideServices; namespace SJZY.Track.Application.Dtos.ProvideServices;
public class CreateOrderInput : UpdateOrderInput public class UpsertOrderInput : UpdateOrderInput
{ {
/// <summary> /// <summary>
/// 客户id /// 客户id

View File

@ -0,0 +1,24 @@
namespace SJZY.Track.Application.Dtos.ProvideServices;
public class UpsertTrackInput : OrderNoInfo
{
/// <summary>
/// 轨迹内容代码
/// </summary>
public string TrackCode { get; set; }
/// <summary>
/// 轨迹发生地
/// </summary>
public string TrackPlace { get; set; }
/// <summary>
/// 轨迹发生时间
/// </summary>
public DateTime TrackTime { get; set; }
/// <summary>
/// 轨迹发生时区
/// </summary>
public float TraceTimeZone { get; set; }
}

View File

@ -26,12 +26,12 @@ namespace SJZY.Track.Application.Dtos.TrackFlags
/// <summary> /// <summary>
/// 标记 /// 标记
/// </summary> /// </summary>
public string Flag { get; set; } public string? Flag { get; set; }
/// <summary> /// <summary>
/// 代码 /// 代码
/// </summary> /// </summary>
public string Code { get; set; } public string? Code { get; set; }
/// <summary> /// <summary>
/// 是否完结 /// 是否完结

View File

@ -1,5 +1,6 @@
using SJZY.Track.Application.Dtos.ProvideServices; using SJZY.Track.Application.Dtos.ProvideServices;
using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.OrderAggregate;
using SJZY.Track.Domain.Queries;
namespace SJZY.Track.Application.Services.ProvideServices; namespace SJZY.Track.Application.Services.ProvideServices;

View File

@ -1,4 +1,5 @@
using SJZY.Track.Application.Dtos.ProvideServices; using SJZY.Expand.ABP.Core.Common.Dto;
using SJZY.Track.Application.Dtos.ProvideServices;
using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.OrderAggregate;
using SJZY.Track.Domain.Dtos.Order; using SJZY.Track.Domain.Dtos.Order;
@ -23,8 +24,8 @@ public class OrderService : ApplicationService
/// <param name="input"></param> /// <param name="input"></param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="BusinessException"></exception> /// <exception cref="BusinessException"></exception>
[HttpPost("Order/CreateOrUpdate")] [HttpPost("Order/Upsert")]
public async Task<string> CreateOrUpdateOrderAsync(CreateOrderInput input) public async Task<string> UpsertAsync(UpsertOrderInput input)
{ {
var order = await _orderRepository.GetFirstAsync(x => var order = await _orderRepository.GetFirstAsync(x =>
x.OrderType == input.OrderType && x.OrderNo == input.OrderNo); x.OrderType == input.OrderType && x.OrderNo == input.OrderNo);
@ -35,7 +36,7 @@ public class OrderService : ApplicationService
return "更新成功"; return "更新成功";
} }
order = ObjectMapper.Map<CreateOrderInput, 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<OrderFligthInfo>, List<OrderFlightEntity>>(input.FlightInfos);
@ -60,12 +61,13 @@ public class OrderService : ApplicationService
throw new BusinessException(message: $"订单:{input.OrderNo}不存在"); throw new BusinessException(message: $"订单:{input.OrderNo}不存在");
} }
await _orderRepository.SoftDeleteAsync(x => x.Id == orderId); await _orderRepository.DeleteOrderAsync(orderId);
return true; return true;
} }
#region 轨迹订单明细 #region 轨迹订单明细
/// <summary> /// <summary>
/// 根据轨迹订单id获取轨迹订单明细列表 /// 根据轨迹订单id获取轨迹订单明细列表
/// </summary> /// </summary>
@ -76,9 +78,11 @@ public class OrderService : ApplicationService
{ {
return null; return null;
} }
#endregion #endregion
#region 轨迹订单列表 #region 轨迹订单列表
/// <summary> /// <summary>
/// 获取分页的轨迹订单 /// 获取分页的轨迹订单
/// </summary> /// </summary>
@ -88,10 +92,11 @@ public class OrderService : ApplicationService
public async Task<UnifyPageResultDto<TrackOrderDto>> GetPageTrackOrder(GetPageTrackOrderInput input) public async Task<UnifyPageResultDto<TrackOrderDto>> GetPageTrackOrder(GetPageTrackOrderInput input)
{ {
var vo = ObjectMapper.Map<GetPageTrackOrderInput, GetPageTrackOrderInputVO>(input); var vo = ObjectMapper.Map<GetPageTrackOrderInput, GetPageTrackOrderInputVO>(input);
var jj = await _orderRepository.GetPageTrackOrder(vo); var pageList = await _orderRepository.GetPageTrackOrder(vo);
var pageResultDto = ObjectMapper.Map<UnifyPageResultDto<TrackOrderVO>, UnifyPageResultDto<TrackOrderDto>>(pageList);
return null; return pageResultDto;
} }
#endregion #endregion
private async Task UpdateOrderAsync(UpdateOrderInput input, OrderEntity order) private async Task UpdateOrderAsync(UpdateOrderInput input, OrderEntity order)

View File

@ -1,7 +1,6 @@
using SJZY.Track.Application.Dtos.ProvideServices; using SJZY.Track.Application.Dtos.ProvideServices;
using SJZY.Track.Domain.Aggregates.OrderAggregate;
using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
using SJZY.Track.Domain.Aggregates.TrackTemplateAggregate; using SJZY.Track.Domain.Queries;
namespace SJZY.Track.Application.Services.ProvideServices; namespace SJZY.Track.Application.Services.ProvideServices;
@ -12,15 +11,13 @@ namespace SJZY.Track.Application.Services.ProvideServices;
public class TrackQueryService : ApplicationService public class TrackQueryService : ApplicationService
{ {
private readonly ITrackDetailsRepository _trackDetailsRepository; private readonly ITrackDetailsRepository _trackDetailsRepository;
private readonly IOrderRepository _orderRepository; private readonly ITrackQueries _trackQueries;
private readonly ITrackTemplateRepository _trackTemplateRepository;
public TrackQueryService(ITrackDetailsRepository trackDetailsRepository, IOrderRepository orderRepository, public TrackQueryService(ITrackDetailsRepository trackDetailsRepository,
ITrackTemplateRepository trackTemplateRepository) ITrackQueries trackQueries)
{ {
_trackDetailsRepository = trackDetailsRepository; _trackDetailsRepository = trackDetailsRepository;
_orderRepository = orderRepository; _trackQueries = trackQueries;
_trackTemplateRepository = trackTemplateRepository;
} }
/// <summary> /// <summary>
@ -29,8 +26,8 @@ public class TrackQueryService : ApplicationService
/// <param name="input"></param> /// <param name="input"></param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="BusinessException"></exception> /// <exception cref="BusinessException"></exception>
[HttpPost("TrackQuery/GetByOrderNos")] [HttpPost("Track/Query")]
public async Task<List<GetTrackOutput>> GetByOrderNosAsync(GetTrackInput input) public async Task<List<GetTrackOutput>> QueryAsync(GetTrackInput input)
{ {
if (input.OrderNos.Count > 500) if (input.OrderNos.Count > 500)
{ {
@ -38,8 +35,8 @@ public class TrackQueryService : ApplicationService
} }
var res = new List<GetTrackOutput>(); var res = new List<GetTrackOutput>();
input.OrderNos = input.OrderNos.Distinct().ToList(); input.OrderNos = input.OrderNos.Distinct().ToList(); // 单号去重
var details = await _trackDetailsRepository.GetListAsync(input.OrderNos); var details = await _trackDetailsRepository.GetListAsync(input.OrderType, input.OrderNos);
var isTurn = input.TimeZone != 0; var isTurn = input.TimeZone != 0;
foreach (var group in details.GroupBy(x => x.OrderId)) foreach (var group in details.GroupBy(x => x.OrderId))
@ -78,18 +75,21 @@ public class TrackQueryService : ApplicationService
list.ForEach(item => item.TrackDetails.Sort((a, b) => b.Time.CompareTo(a.Time))); list.ForEach(item => item.TrackDetails.Sort((a, b) => b.Time.CompareTo(a.Time)));
break; break;
case SortMethod.ByTemplate: case SortMethod.ByTemplate:
var orderTemplates = await _orderRepository.GetOrderTemplatesAsync(input.OrderType, input.OrderNos); var orderTemplates = await _trackQueries
.GetOrderTemplateLinksAsync(input.OrderType, input.OrderNos);
var distinctTemplateIds = orderTemplates.Select(x => x.TemplateId).Distinct().ToList(); var distinctTemplateIds = orderTemplates.Select(x => x.TemplateId).Distinct().ToList();
var templateContent = var templateContent = await _trackQueries.GetOrderedTrackCodesAsync(distinctTemplateIds);
await _trackTemplateRepository.GetTemplateContentOrderlyAsync(distinctTemplateIds);
list.ForEach(item => list.ForEach(item =>
{ {
var template = orderTemplates.FirstOrDefault(x => x.OrderNo == item.OrderNo); var codes = new List<string>();
if (template == default) return; // 多模板拼接显示
var codes = templateContent foreach (var orderTemplate in orderTemplates.Where(x => x.OrderNo == item.OrderNo))
.Where(x => x.TemplateId == template.TemplateId) {
.Select(x => x.Code) codes.AddRange(templateContent
.ToList(); .Where(t => t.TemplateId == orderTemplate.TemplateId)
.Select(t => t.Code));
}
item.TrackDetails = item.TrackDetails item.TrackDetails = item.TrackDetails
.Where(x => codes.Contains(x.Code)) // 剔除不在模板内容中的元素 .Where(x => codes.Contains(x.Code)) // 剔除不在模板内容中的元素
.OrderBy(x => codes.IndexOf(x.Code)) // 按照在模板内容的位置排序 .OrderBy(x => codes.IndexOf(x.Code)) // 按照在模板内容的位置排序

View File

@ -1,5 +1,85 @@
namespace SJZY.Track.Application.Services.ProvideServices; using SJZY.Track.Application.Dtos.ProvideServices;
using SJZY.Track.Domain.Aggregates.OrderAggregate;
using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
using SJZY.Track.Domain.Queries;
using SJZY.UserCenter.HttpApi.Services;
public class TrackService namespace SJZY.Track.Application.Services.ProvideServices;
/// <summary>
/// 轨迹服务
/// </summary>
[ApiExplorerSettings(GroupName = "提供接口")]
public class TrackService : ApplicationService
{ {
private readonly IOrderRepository _orderRepository;
private readonly ITrackDetailsRepository _trackDetailsRepository;
private readonly ITrackQueries _trackQueries;
public TrackService(ITrackQueries trackQueries, IOrderRepository orderRepository,
ITrackDetailsRepository trackDetailsRepository)
{
_trackQueries = trackQueries;
_orderRepository = orderRepository;
_trackDetailsRepository = trackDetailsRepository;
}
/// <summary>
/// 新增/更新订单轨迹接口
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
/// <exception cref="BusinessException"></exception>
[HttpPost("Track/Upsert")]
public async Task<bool> UpsertTrackAsync(UpsertTrackInput input)
{
var orderId = await _orderRepository.GetFirstAsync(x =>
x.OrderType == input.OrderType && x.OrderNo == input.OrderNo, x => x.Id);
if (orderId == default)
{
throw new BusinessException(message: $"订单:{input.OrderNo}不存在");
}
// 不存在则新增轨迹,存在则更新
var track = await _trackDetailsRepository.GetFirstOrDefaultAsync(orderId, input.TrackCode);
if (track == default)
{
var trackContent = await _trackQueries.MatchTrackContentAsync(orderId, input.TrackCode);
if (trackContent == default)
{
throw new BusinessException(message: $"订单:{input.OrderNo} 所绑定的模板,没有一条内容可以匹配轨迹代码:{input.TrackCode}");
}
track = new TrackDetailsIndex
{
OrderId = orderId,
OrderNo = input.OrderNo,
OrderType = input.OrderType,
TrackStatus = trackContent.Status,
TrackCode = input.TrackCode,
TrackContent = trackContent.Content,
TrackEnContent = trackContent.EnContent,
TrackPlace = input.TrackPlace,
TrackTime = input.TrackTime,
TraceTimeZone = input.TraceTimeZone,
CreateUserId = CurrentUserRequest.CurrentUser.UserId,
CreateTime = DateTime.Now
};
await _trackDetailsRepository.CreateAsync(track);
}
else
{
track.UpdateUserId = CurrentUserRequest.CurrentUser.UserId;
track.UpdateTime = DateTime.Now;
track.TrackPlace = input.TrackPlace;
track.TrackTime = input.TrackTime;
track.TraceTimeZone = input.TraceTimeZone;
await _trackDetailsRepository.UpdateAsync(track);
}
// 根据订单关联关系向下刷,不同子系统还需要做内容映射
// 推送
return true;
}
} }

View File

@ -10,15 +10,8 @@ public interface IOrderRepository : IBasicRepository<OrderEntity>
/// <param name="order"></param> /// <param name="order"></param>
/// <returns></returns> /// <returns></returns>
Task<bool> CreateOrderAsync(OrderEntity order); Task<bool> CreateOrderAsync(OrderEntity order);
Task<List<TrackOrderDetailVO>> GetOrderDetails(GetOrderDetailsInputVO input);
/// <summary> Task<List<TrackOrderDetailVO>> GetOrderDetails(GetOrderDetailsInputVO input);
/// 根据订单号,获取订单模板
/// </summary>
/// <param name="orderType">订单类型</param>
/// <param name="distinctOrderNumbers"></param>
/// <returns></returns>
Task<List<OrderTemplateDto>> GetOrderTemplatesAsync(int orderType, List<string> distinctOrderNumbers);
/// <summary> /// <summary>
/// 获取分页的轨迹订单 /// 获取分页的轨迹订单
@ -47,4 +40,11 @@ public interface IOrderRepository : IBasicRepository<OrderEntity>
/// <param name="order"></param> /// <param name="order"></param>
/// <returns></returns> /// <returns></returns>
Task UpdateOrderAsync(OrderEntity order); Task UpdateOrderAsync(OrderEntity order);
/// <summary>
/// 删除订单
/// </summary>
/// <param name="orderId"></param>
/// <returns></returns>
Task DeleteOrderAsync(int orderId);
} }

View File

@ -4,7 +4,7 @@
/// 订单航班表(1:N) /// 订单航班表(1:N)
/// </summary> /// </summary>
[SugarTable("t_order_flight")] [SugarTable("t_order_flight")]
public class OrderFlightEntity : ICreateBaicEntity, IEntity public class OrderFlightEntity : ICreateBaicEntity, ISoftDeleteBasicEntity, IEntity
{ {
/// <summary> /// <summary>
/// 自增主键 /// 自增主键
@ -33,10 +33,18 @@ public class OrderFlightEntity : ICreateBaicEntity, IEntity
/// <summary> /// <summary>
/// 创建人 /// 创建人
/// </summary> /// </summary>
[SugarColumn(ColumnName = "CreateUserId")]
public int CreateUserId { get; set; } public int CreateUserId { get; set; }
/// <summary> /// <summary>
/// 创建时间 /// 创建时间
/// </summary> /// </summary>
[SugarColumn(ColumnName = "CreateTime")]
public DateTime? CreateTime { get; set; } public DateTime? CreateTime { get; set; }
/// <summary>
/// 是否删除
/// </summary>
[SugarColumn(ColumnName = "IsDeleted")]
public bool IsDeleted { get; set; }
} }

View File

@ -4,7 +4,7 @@
/// 轨迹订单关联表(1:N) /// 轨迹订单关联表(1:N)
/// </summary> /// </summary>
[SugarTable("t_order_link")] [SugarTable("t_order_link")]
public class OrderLinkEntity : ICreateBaicEntity, IEntity public class OrderLinkEntity : ICreateBaicEntity, ISoftDeleteBasicEntity, IEntity
{ {
/// <summary> /// <summary>
/// 自增主键 /// 自增主键
@ -39,10 +39,18 @@ public class OrderLinkEntity : ICreateBaicEntity, IEntity
/// <summary> /// <summary>
/// 创建人 /// 创建人
/// </summary> /// </summary>
[SugarColumn(ColumnName = "CreateUserId")]
public int CreateUserId { get; set; } public int CreateUserId { get; set; }
/// <summary> /// <summary>
/// 创建时间 /// 创建时间
/// </summary> /// </summary>
[SugarColumn(ColumnName = "CreateTime")]
public DateTime? CreateTime { get; set; } public DateTime? CreateTime { get; set; }
/// <summary>
/// 是否删除
/// </summary>
[SugarColumn(ColumnName = "IsDeleted")]
public bool IsDeleted { get; set; }
} }

View File

@ -4,7 +4,7 @@
/// 轨迹订单模板表(1:N) /// 轨迹订单模板表(1:N)
/// </summary> /// </summary>
[SugarTable("t_order_template")] [SugarTable("t_order_template")]
public class OrderTemplateEntity : ICreateBaicEntity, IEntity public class OrderTemplateEntity : ICreateBaicEntity, ISoftDeleteBasicEntity, IEntity
{ {
/// <summary> /// <summary>
/// 自增主键 /// 自增主键
@ -30,6 +30,21 @@ public class OrderTemplateEntity : ICreateBaicEntity, IEntity
[SugarColumn(ColumnName = "TrackTemplateId")] [SugarColumn(ColumnName = "TrackTemplateId")]
public int TrackTemplateId { get; set; } public int TrackTemplateId { get; set; }
/// <summary>
/// 创建人
/// </summary>
[SugarColumn(ColumnName = "CreateUserId")]
public int CreateUserId { get; set; } public int CreateUserId { get; set; }
/// <summary>
/// 创建时间
/// </summary>
[SugarColumn(ColumnName = "CreateTime")]
public DateTime? CreateTime { get; set; } public DateTime? CreateTime { get; set; }
/// <summary>
/// 是否删除
/// </summary>
[SugarColumn(ColumnName = "IsDeleted")]
public bool IsDeleted { get; set; }
} }

View File

@ -16,19 +16,19 @@ public class TrackContentEntity : IFullAuditedBasicEntitys, IAggregateRoot
/// 轨迹内容代码 /// 轨迹内容代码
/// </summary> /// </summary>
[SugarColumn(ColumnName = "Code")] [SugarColumn(ColumnName = "Code")]
public string Code { get; set; } public string Code { get; set; } = null!;
/// <summary> /// <summary>
/// 轨迹内容 /// 轨迹内容
/// </summary> /// </summary>
[SugarColumn(ColumnName = "Content")] [SugarColumn(ColumnName = "Content")]
public string Content { get; set; } public string Content { get; set; } = null!;
/// <summary> /// <summary>
/// 轨迹内容英文 /// 轨迹内容英文
/// </summary> /// </summary>
[SugarColumn(ColumnName = "EnContent")] [SugarColumn(ColumnName = "EnContent")]
public string EnContent { get; set; } public string EnContent { get; set; } = null!;
/// <summary> /// <summary>
/// 子系统id /// 子系统id

View File

@ -4,9 +4,13 @@ namespace SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
public interface ITrackDetailsRepository public interface ITrackDetailsRepository
{ {
Task WriteTrack(TrackDetailsIndex index); Task<TrackDetailsIndex?> GetFirstOrDefaultAsync(int orderId, string inputTrackCode);
Task<List<TrackDetailsIndex>> GetListAsync(List<string> orderNos); Task UpdateAsync(TrackDetailsIndex index);
Task CreateAsync(TrackDetailsIndex index);
Task<List<TrackDetailsIndex>> GetListAsync(int orderType, List<string> orderNos);
Task<(List<TrackDetailsIndex> list, long total)> GetListAsync(TrackDetailsQueryInput input); Task<(List<TrackDetailsIndex> list, long total)> GetListAsync(TrackDetailsQueryInput input);
} }

View File

@ -21,7 +21,7 @@ public class TrackDetailsIndex : IdBaseIndex
/// <summary> /// <summary>
/// 订单类型(主数据枚举TrackOrderType) /// 订单类型(主数据枚举TrackOrderType)
/// </summary> /// </summary>
public string OrderType { get; set; } public int OrderType { get; set; }
/// <summary> /// <summary>
/// 轨迹状态 /// 轨迹状态

View File

@ -16,13 +16,13 @@ public class TrackStatusEntity : IFullAuditedBasicEntitys, IAggregateRoot
/// 轨迹状态代码 /// 轨迹状态代码
/// </summary> /// </summary>
[SugarColumn(ColumnName = "Code")] [SugarColumn(ColumnName = "Code")]
public string Code { get; set; } public string Code { get; set; } = null!;
/// <summary> /// <summary>
/// 轨迹状态英文 /// 轨迹状态英文
/// </summary> /// </summary>
[SugarColumn(ColumnName = "EnStatus")] [SugarColumn(ColumnName = "EnStatus")]
public string EnStatus { get; set; } public string EnStatus { get; set; } = null!;
/// <summary> /// <summary>
/// 所属节点(主数据枚举ServiceNode) /// 所属节点(主数据枚举ServiceNode)
@ -34,7 +34,7 @@ public class TrackStatusEntity : IFullAuditedBasicEntitys, IAggregateRoot
/// 轨迹状态 /// 轨迹状态
/// </summary> /// </summary>
[SugarColumn(ColumnName = "Status")] [SugarColumn(ColumnName = "Status")]
public string Status { get; set; } public string Status { get; set; } = null!;
/// <summary> /// <summary>
/// 子系统id /// 子系统id

View File

@ -4,8 +4,6 @@ namespace SJZY.Track.Domain.Aggregates.TrackTemplateAggregate;
public interface ITrackTemplateRepository : IBasicRepository<TrackTemplateEntity> public interface ITrackTemplateRepository : IBasicRepository<TrackTemplateEntity>
{ {
Task<List<TemplateContentOrderlyDto>> GetTemplateContentOrderlyAsync(List<int> distinctTemplateIds);
Task<GetTrackTemplateDetailVO?> GetDetailAsync(int id); Task<GetTrackTemplateDetailVO?> GetDetailAsync(int id);
Task<UnifyPageResultDto<GetTrackTemplateListVO>> GetPageTrackTemplate(GetPageTrackTemplateVO input); Task<UnifyPageResultDto<GetTrackTemplateListVO>> GetPageTrackTemplate(GetPageTrackTemplateVO input);
@ -35,5 +33,6 @@ public interface ITrackTemplateRepository : IBasicRepository<TrackTemplateEntity
Task<bool> SoftDeleteContentAsync(int id); Task<bool> SoftDeleteContentAsync(int id);
Task<List<TrackTemplateContentEntity>> GetContentListAsync(Expression<Func<TrackTemplateContentEntity, bool>> whereExpression); Task<List<TrackTemplateContentEntity>> GetContentListAsync(
Expression<Func<TrackTemplateContentEntity, bool>> whereExpression);
} }

View File

@ -40,16 +40,63 @@ namespace SJZY.Track.Domain.Dtos.Order
public int Id { get; set; } public int Id { get; set; }
/// <summary> /// <summary>
/// 订单类型 /// 订单类型id
/// </summary> /// </summary>
public string OrderType { get; set; } public int OrderType { get; set; }
/// <summary>
public string OrderNumber { get; set; } /// 订单号
/// </summary>
public string? OrderNumber { get; set; }
/// <summary> /// <summary>
/// 轨迹模版 /// 轨迹模版
/// </summary> /// </summary>
public string TrackTemplateNames { get; set; } public string? TrackTemplateNames { get; set; }
/// <summary>
/// 客户简称
/// </summary>
public string? CustomerShortName { get; set; }
/// <summary>
/// 客户代码
/// </summary>
public string? CustomerCode { get; set; }
/// <summary>
/// 订单明细(json)
/// </summary>
public string? OrderDetails { get; set; }
/// <summary>
/// 最新轨迹内容
/// </summary>
public string? NewestTrackContent { get; set; }
/// <summary>
/// 最新轨迹内容英文
/// </summary>
public string? NewestTrackEnContent { get; set; }
/// <summary>
/// 最新轨迹发生地
/// </summary>
public string? NewestTrackPlace { get; set; }
/// <summary>
/// 是否完结
/// </summary>
public bool IsFinish { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime? CreateTime { get; set; }
/// <summary>
/// 子系统
/// </summary>
public string SubSystem { get; set; }
} }
} }

View File

@ -0,0 +1,23 @@
namespace SJZY.Track.Domain.Dtos.Order;
/// <summary>
/// 订单标识符
/// </summary>
public readonly struct OrderIdentifier
{
public OrderIdentifier(int orderType, string orderNo)
{
OrderType = orderType;
OrderNo = orderNo;
}
/// <summary>
/// 订单类型
/// </summary>
public int OrderType { get; }
/// <summary>
/// 订单号
/// </summary>
public string OrderNo { get; }
}

View File

@ -1,11 +1,11 @@
namespace SJZY.Track.Domain.Dtos.Order; namespace SJZY.Track.Domain.Dtos.Order;
public class OrderTemplateDto public class OrderTemplateLinkDto
{ {
/// <summary> /// <summary>
/// 订单号 /// 订单号
/// </summary> /// </summary>
public string OrderNo { get; set; } public string OrderNo { get; set; } = null!;
/// <summary> /// <summary>
/// 模板id /// 模板id

View File

@ -0,0 +1,19 @@
namespace SJZY.Track.Domain.Dtos.TrackDetails;
public class MatchTrackContentDto
{
/// <summary>
/// 轨迹内容
/// </summary>
public string Content { get; set; }
/// <summary>
/// 轨迹内容英文
/// </summary>
public string EnContent { get; set; }
/// <summary>
/// 轨迹状态
/// </summary>
public string Status { get; set; }
}

View File

@ -1,6 +1,6 @@
namespace SJZY.Track.Domain.Dtos.TrackTemplate; namespace SJZY.Track.Domain.Dtos.TrackTemplate;
public class TemplateContentOrderlyDto public class OrderedTrackCodeDto
{ {
/// <summary> /// <summary>
/// 模板id /// 模板id

View File

@ -1,4 +1,6 @@
namespace SJZY.Track.Domain; using SJZY.Track.Domain.Queries;
namespace SJZY.Track.Domain;
public interface IBasicRepository<T> : IBasicQuery<T> where T : IAggregateRoot public interface IBasicRepository<T> : IBasicQuery<T> where T : IAggregateRoot
{ {

View File

@ -1,4 +1,4 @@
namespace SJZY.Track.Domain; namespace SJZY.Track.Domain.Queries;
public interface IBasicQuery<T> where T : IEntity public interface IBasicQuery<T> where T : IEntity
{ {

View File

@ -0,0 +1,34 @@
using SJZY.Track.Domain.Dtos.Order;
using SJZY.Track.Domain.Dtos.TrackDetails;
using SJZY.Track.Domain.Dtos.TrackTemplate;
namespace SJZY.Track.Domain.Queries;
/// <summary>
/// 提供接口专用查询
/// </summary>
public interface ITrackQueries
{
/// <summary>
/// 根据订单号,获取订单模板
/// </summary>
/// <param name="orderType">订单类型</param>
/// <param name="orderNumbers">订单号</param>
/// <returns></returns>
Task<List<OrderTemplateLinkDto>> GetOrderTemplateLinksAsync(int orderType, List<string> orderNumbers);
/// <summary>
/// 根据订单模板,获取有序的轨迹code
/// </summary>
/// <param name="templateIds">模板id</param>
/// <returns></returns>
Task<List<OrderedTrackCodeDto>> GetOrderedTrackCodesAsync(List<int> templateIds);
/// <summary>
/// 根据订单id找到订单模板,匹配模板命中的轨迹内容
/// </summary>
/// <param name="orderId">订单id</param>
/// <param name="code">轨迹代码</param>
/// <returns></returns>
Task<MatchTrackContentDto?> MatchTrackContentAsync(int orderId, string code);
}

View File

@ -1,5 +1,5 @@
using System.Linq.Expressions; using System.Linq.Expressions;
using SJZY.Track.Domain; using SJZY.Track.Domain.Queries;
using SJZY.Track.Domain.SeedWork; using SJZY.Track.Domain.SeedWork;
namespace SJZY.Track.Repository; namespace SJZY.Track.Repository;

View File

@ -1,77 +1,77 @@
#pragma warning disable 1591 using SJZY.UserCenter.HttpApi.Services;
using SJZY.UserCenter.HttpApi.Services;
namespace SJZY.Track.Repository #pragma warning disable 1591
namespace SJZY.Track.Repository;
/// <summary>
/// Sqlsugar 上下文对象
/// </summary>
public class DataBaseContext
{ {
/// <summary> #region 审计属性自动赋值
/// Sqlsugar 上下文对象
/// </summary> public static void OnExcutingAction(object oldValue, DataFilterModel entityInfo)
public class DataBaseContext
{ {
//过滤掉 "v_" 开头的表
if (entityInfo.EntityColumnInfo.DbTableName.StartsWith("v_", StringComparison.OrdinalIgnoreCase))
throw new Exception("非法的操作,不允许编辑映射表");
#region 审计属性自动赋值 //新增
if (entityInfo.OperationType == DataFilterType.InsertByObject)
public static void OnExcutingAction(object oldValue, DataFilterModel entityInfo)
{ {
//过滤掉 "v_" 开头的表 if (entityInfo.PropertyName == nameof(ICreateBaicEntity.CreateTime))
if (entityInfo.EntityColumnInfo.DbTableName.StartsWith("v_", StringComparison.OrdinalIgnoreCase)) entityInfo.SetValue(DateTime.Now);
throw new Exception("非法的操作,不允许编辑映射表"); if (entityInfo.PropertyName == nameof(ICreateBaicEntity.CreateUserId))
//新增
if (entityInfo.OperationType == DataFilterType.InsertByObject)
{ {
if (entityInfo.PropertyName == nameof(ICreateBaicEntity.CreateTime)) if (oldValue == null || (int)oldValue == 0)
entityInfo.SetValue(DateTime.Now);
if (entityInfo.PropertyName == nameof(ICreateBaicEntity.CreateUserId))
{ {
if (oldValue == null || (int)oldValue == 0) try
{
entityInfo.SetValue(CurrentUserRequest.CurrentUser?.UserId);
}
catch
{ {
try
{
entityInfo.SetValue(CurrentUserRequest.CurrentUser?.UserId);
}
catch
{
}
} }
//entityInfo.SetValue(CurrentUserRequest.CurrentUser.UserId);
} }
//entityInfo.SetValue(CurrentUserRequest.CurrentUser.UserId);
} }
//修改 }
else if (entityInfo.OperationType == DataFilterType.UpdateByObject) //修改
else if (entityInfo.OperationType == DataFilterType.UpdateByObject)
{
if (entityInfo.PropertyName == nameof(IUpdateBasicEntity.UpdateTime))
entityInfo.SetValue(DateTime.Now);
else if (entityInfo.PropertyName == nameof(IUpdateBasicEntity.UpdateUserId))
{ {
if (entityInfo.PropertyName == nameof(IUpdateBasicEntity.UpdateTime)) if (oldValue == null || (int)oldValue == 1)
entityInfo.SetValue(DateTime.Now);
else if (entityInfo.PropertyName == nameof(IUpdateBasicEntity.UpdateUserId))
{ {
if (oldValue == null || (int)oldValue == 1) try
{
entityInfo.SetValue(CurrentUserRequest.CurrentUser.UserId);
}
catch
{ {
try
{
entityInfo.SetValue(CurrentUserRequest.CurrentUser.UserId);
}
catch
{
}
} }
//entityInfo.SetValue(CurrentUserRequest.CurrentUser.UserId);
} }
//删除 //entityInfo.SetValue(CurrentUserRequest.CurrentUser.UserId);
else if (entityInfo.PropertyName == nameof(IDeleteBasicEntity.IsDeleted)) }
//删除
else if (entityInfo.PropertyName == nameof(IDeleteBasicEntity.IsDeleted))
{
var currentType = entityInfo.EntityValue.GetType();
bool.TryParse(
currentType.GetProperty(entityInfo.PropertyName)?.GetValue(entityInfo.EntityValue)?.ToString(),
out bool isdelete);
if (isdelete)
{ {
var currentType = entityInfo.EntityValue.GetType(); //currentType.GetProperty(nameof(IDeleteBasicEntity.DeleteUserId))?.SetValue(entityInfo.EntityValue, 5);
bool.TryParse(currentType.GetProperty(entityInfo.PropertyName)?.GetValue(entityInfo.EntityValue)?.ToString(), out bool isdelete); currentType.GetProperty(nameof(IDeleteBasicEntity.DeleteTime))
if (isdelete) ?.SetValue(entityInfo.EntityValue, DateTime.Now);
{
//currentType.GetProperty(nameof(IDeleteBasicEntity.DeleteUserId))?.SetValue(entityInfo.EntityValue, 5);
currentType.GetProperty(nameof(IDeleteBasicEntity.DeleteTime))?.SetValue(entityInfo.EntityValue, DateTime.Now);
}
} }
} }
} }
#endregion 审计属性自动赋值
} }
#endregion 审计属性自动赋值
} }

View File

@ -1,8 +1,10 @@
using Microsoft.AspNetCore.Mvc; using Nest;
using SJZY.Track.Domain; using SJZY.Track.Domain;
using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.OrderAggregate;
using SJZY.Track.Domain.Aggregates.TrackTemplateAggregate; using SJZY.Track.Domain.Aggregates.TrackTemplateAggregate;
using SJZY.Track.Domain.Dtos.Order; using SJZY.Track.Domain.Dtos.Order;
using SJZY.Track.Domain.VEntities;
using SJZY.Track.Repository.VData.Entitys;
namespace SJZY.Track.Repository; namespace SJZY.Track.Repository;
@ -16,20 +18,6 @@ public class OrderRepository : BasicRepository<OrderEntity>, IOrderRepository, I
.ExecuteCommandAsync(); .ExecuteCommandAsync();
} }
public async Task<List<OrderTemplateDto>> GetOrderTemplatesAsync(int orderType,
List<string> distinctOrderNumbers)
{
return await AsQueryable()
.LeftJoin<OrderTemplateEntity>((a, b) => a.Id == b.OrderId)
.Where(a => a.OrderType == orderType && distinctOrderNumbers.Contains(a.OrderNo))
.Select((a, b) => new OrderTemplateDto
{
OrderNo = a.OrderNo,
TemplateId = b.TrackTemplateId
})
.ToListAsync();
}
public async Task LinkOrderAsync(List<OrderLinkEntity> orderLinkEntities) public async Task LinkOrderAsync(List<OrderLinkEntity> orderLinkEntities)
{ {
await Context.Insertable(orderLinkEntities).ExecuteCommandAsync(); await Context.Insertable(orderLinkEntities).ExecuteCommandAsync();
@ -60,6 +48,20 @@ public class OrderRepository : BasicRepository<OrderEntity>, IOrderRepository, I
tran.Complete(); tran.Complete();
} }
public async Task DeleteOrderAsync(int orderId)
{
using var tran = TransactionHelper.GetReadCommitted();
// 软删订单主表
await SoftDeleteAsync(x => x.Id == orderId);
// 软删订单模板
// 软删订单航班
// 软删订单关联关系
tran.Complete();
}
#region 轨迹订单明细 #region 轨迹订单明细
/// <summary> /// <summary>
@ -71,9 +73,11 @@ public class OrderRepository : BasicRepository<OrderEntity>, IOrderRepository, I
{ {
return null; return null;
} }
#endregion #endregion
#region 轨迹订单分页 #region 轨迹订单分页
/// <summary> /// <summary>
/// 获取分页的轨迹订单 /// 获取分页的轨迹订单
/// </summary> /// </summary>
@ -81,29 +85,48 @@ public class OrderRepository : BasicRepository<OrderEntity>, IOrderRepository, I
/// <returns></returns> /// <returns></returns>
public async Task<UnifyPageResultDto<TrackOrderVO>> GetPageTrackOrder(GetPageTrackOrderInputVO input) public async Task<UnifyPageResultDto<TrackOrderVO>> GetPageTrackOrder(GetPageTrackOrderInputVO input)
{ {
//await Context.Queryable<OrderEntity, OrderTemplateEntity>((a,b)= ); var pageList = await Context.Queryable<OrderEntity>()
//await Context.Queryable<OrderEntity, OrderTemplateEntity>((a, b) => new JoinQueryInfos(JoinType.Left, a.Id==b.OrderId)) .LeftJoin<VExternalSubjectEntity>((a, b) => a.CustomId==b.Id)
// .GroupBy((a, b) => new { a.Id }) .LeftJoin<VSystemEntity>((a, b, c) => a.SubSystemId==c.Id)
// .Select((a, b) => new TrackOrderVO .Select((a, b, c) => new TrackOrderVO
// { {
// Id=a.Id, Id = a.Id,
// OrderNumber=a.OrderNo, OrderNumber= a.OrderNo,
// TrackTemplateNames = SqlFunc.AggregateConcat(b.) OrderType = a.OrderType,
CustomerShortName= b.Abbreviation,
CustomerCode= b.Code,
TrackTemplateNames = "",
OrderDetails="",
NewestTrackContent= a.LatestTrackContent,
NewestTrackEnContent= a.LatestTrackEnContent,
NewestTrackPlace= a.LatestTrackPlace,
IsFinish=a.IsCompleted,
CreateTime=a.CreateTime,
SubSystem= c.CnName
})
.ToPagedListAsync(input.PageIndex, input.PageSize);
if (pageList.List.Any())
{
var orderIds = pageList.List.Select(a => a.Id);
//查询轨迹模版
// }).ToPageListAsync(input.PageIndex, input.PageSize); var trackTemplateList = await Context.Queryable<OrderTemplateEntity>()
.LeftJoin<TrackTemplateEntity>((a, b) => a.TrackTemplateId==b.Id)
.Where((a, b) => orderIds.Contains(a.OrderId))
.Select((a, b) => new { OrderId = a.OrderId, Name = b.Name })
.ToListAsync();
//await Context.Queryable<OrderEntity>() pageList.List.ForEach(a =>
// .Includes(a => a.OrderTemplates) {
// .Select(a => new TrackOrderVO var templateListOfOrderId = trackTemplateList.Where(b => b.OrderId== a.Id);
// { a.TrackTemplateNames = templateListOfOrderId.Select(c => c.Name).JoinAsString(",");
// Id=a.Id, });
// OrderNumber=a.OrderNo, }
// TrackTemplateNames = SqlFunc.Subqueryable<OrderTemplateEntity>().Where(z=>z.OrderId==a.Id).SelectStringJoin(z=>z.)
// })
// .ToPageListAsync(input.PageIndex, input.PageSize);
return null; return pageList;
} }
#endregion #endregion
} }

View File

@ -0,0 +1,78 @@
using SJZY.Track.Domain.Aggregates.OrderAggregate;
using SJZY.Track.Domain.Aggregates.TrackContentAggregate;
using SJZY.Track.Domain.Aggregates.TrackStatusAggregate;
using SJZY.Track.Domain.Aggregates.TrackTemplateAggregate;
using SJZY.Track.Domain.Dtos.Order;
using SJZY.Track.Domain.Dtos.TrackDetails;
using SJZY.Track.Domain.Dtos.TrackTemplate;
using SJZY.Track.Domain.Queries;
namespace SJZY.Track.Repository.Queries;
public class TrackQueries : ISugarRepository, ITrackQueries,
ITransientDependency
{
public ISqlSugarClient Context { get; set; }
public TrackQueries()
{
Context = SqlsugarScopeBasic.GetContextSafely("default");
}
public async Task<List<OrderTemplateLinkDto>> GetOrderTemplateLinksAsync(int orderType,
params string[] orderNumbers)
{
return await Context.Queryable<OrderEntity>()
.LeftJoin<OrderTemplateEntity>((a, b) => a.Id == b.OrderId)
.Where(a => a.OrderType == orderType && orderNumbers.Contains(a.OrderNo))
.Select((a, b) => new OrderTemplateLinkDto
{
OrderNo = a.OrderNo,
TemplateId = b.TrackTemplateId
})
.ToListAsync();
}
public async Task<List<OrderTemplateLinkDto>> GetOrderTemplateLinksAsync(int orderType, List<string> orderNumbers)
{
return await Context.Queryable<OrderEntity>()
.LeftJoin<OrderTemplateEntity>((a, b) => a.Id == b.OrderId)
.Where(a => a.OrderType == orderType && orderNumbers.Contains(a.OrderNo))
.Select((a, b) => new OrderTemplateLinkDto
{
OrderNo = a.OrderNo,
TemplateId = b.TrackTemplateId
})
.ToListAsync();
}
public async Task<List<OrderedTrackCodeDto>> GetOrderedTrackCodesAsync(List<int> templateIds)
{
return await Context.Queryable<TrackTemplateContentEntity>()
.LeftJoin<TrackContentEntity>((a, b) => a.TrackContentId == b.Id)
.Where(a => templateIds.Contains(a.TrackTemplateId))
.OrderBy(a => a.Sort)
.Select((a, b) => new OrderedTrackCodeDto
{
TemplateId = a.Id,
Code = b.Code
})
.ToListAsync();
}
public async Task<MatchTrackContentDto?> MatchTrackContentAsync(int orderId, string code)
{
return await Context.Queryable<OrderTemplateEntity>()
.LeftJoin<TrackTemplateContentEntity>((x, a) => x.TrackTemplateId == a.TrackTemplateId)
.LeftJoin<TrackContentEntity>((x, a, b) => a.TrackContentId == b.Id)
.LeftJoin<TrackStatusEntity>((x, a, b, c) => b.TrackStatusId == c.Id)
.Where((x, a, b) => x.OrderId == orderId && b.Code == code)
.Select((x, a, b, c) => new MatchTrackContentDto
{
Content = b.Content,
EnContent = b.EnContent,
Status = c.Status
})
.FirstAsync();
}
}

View File

@ -3,6 +3,7 @@ using Microsoft.Extensions.DependencyInjection;
using SJZY.Expand.ABP.Core.SqlSugar.Options; using SJZY.Expand.ABP.Core.SqlSugar.Options;
using SJZY.Expand.ElasticSearch; using SJZY.Expand.ElasticSearch;
using SJZY.Track.Domain; using SJZY.Track.Domain;
using SJZY.Track.Domain.Queries;
using Volo.Abp.Autofac; using Volo.Abp.Autofac;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
@ -44,9 +45,6 @@ public class SJZYTrackRepositoryModule : AbpModule
} }
public override void ConfigureServices(ServiceConfigurationContext context) public override void ConfigureServices(ServiceConfigurationContext context)
{ {
context.Services.AddTransient(typeof(IBasicQuery<>), typeof(BasicQuery<>)); context.Services.AddTransient(typeof(IBasicQuery<>), typeof(BasicQuery<>));

View File

@ -1,6 +1,4 @@
using Nest; using Nest;
using SJZY.Expand.ABP.Core.Logger;
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.Dtos.TrackDetails; using SJZY.Track.Domain.Dtos.TrackDetails;
@ -10,26 +8,49 @@ namespace SJZY.Track.Repository;
internal class TrackDetailsRepository : ElasticSearchContextAbstract<TrackDetailsIndex>, ITrackDetailsRepository, internal class TrackDetailsRepository : ElasticSearchContextAbstract<TrackDetailsIndex>, ITrackDetailsRepository,
ITransientDependency ITransientDependency
{ {
public string IndexName => $"{TrackDetailsIndex.IndexName}-{DateTime.Now:yyyy.MM.dd}";
public TrackDetailsRepository(ConnectionFactory connectionFactory) : base(connectionFactory) public TrackDetailsRepository(ConnectionFactory connectionFactory) : base(connectionFactory)
{ {
} }
public async Task WriteTrack(TrackDetailsIndex index) public async Task<TrackDetailsIndex?> GetFirstOrDefaultAsync(int orderId, string trackCode)
{ {
try var r = await Context.SearchAsync<TrackDetailsIndex>(s => s
.Index($"{TrackDetailsIndex.IndexName}-{DateTime.Now:yyyy.MM.dd}")
.Query(q =>
q.Term(t => t.Field(f => f.OrderId).Value(orderId))
&& q.Term(t => t.Field(f => f.TrackCode).Value(trackCode))
)
);
if (r.IsValid)
{ {
//await Context.IndexDocumentAsync(idx); return r.Documents.FirstOrDefault();
var response = await Context.IndexAsync(index,
request => request.Index($"{TrackDetailsIndex.IndexName}-{DateTime.Now:yyyy.MM.dd}"));
if (!response.IsValid) LogHelper.Error("数据添加失败,原因:" + response.DebugInformation);
}
catch (Exception ex)
{
LogHelper.Error($"日志插入ES失败:{ex.Message}。{index.ToJson()}");
} }
return default;
} }
public async Task<List<TrackDetailsIndex>> GetListAsync(List<string> orderNos) public async Task UpdateAsync(TrackDetailsIndex index)
{
var response = await Context.UpdateAsync<TrackDetailsIndex>(index.Id, u => u
.Index(IndexName)
.Doc(index)
//.Refresh(Refresh.True) // 可选:立即刷新索引使更改立即可见
);
if (!response.IsValid)
throw new Exception($"数据修改失败,原因:{response.DebugInformation}");
}
public async Task CreateAsync(TrackDetailsIndex index)
{
var response = await Context.IndexAsync(index, request => request.Index(IndexName));
if (!response.IsValid)
throw new Exception($"数据添加失败,原因:{response.DebugInformation}");
}
public async Task<List<TrackDetailsIndex>> GetListAsync(int orderType, List<string> orderNos)
{ {
if (orderNos.Count < 1) return new List<TrackDetailsIndex>(); if (orderNos.Count < 1) return new List<TrackDetailsIndex>();
@ -42,9 +63,11 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract<TrackDetail
.Field(f => f.TrackTime) .Field(f => f.TrackTime)
.Field(f => f.TraceTimeZone) .Field(f => f.TraceTimeZone)
)) ))
.Query(q => q.Terms(t => t .Query(q =>
.Field(f => f.OrderNo) q.Terms(t => t
.Terms(orderNos))) .Field(f => f.OrderNo)
.Terms(orderNos))
&& q.Term(f => f.OrderType, orderType))
); );
return data.Documents.ToList(); return data.Documents.ToList();

View File

@ -10,24 +10,8 @@ using SJZY.Track.Repository.Enum;
namespace SJZY.Track.Repository; namespace SJZY.Track.Repository;
/// <inheritdoc/>
public class TrackTemplateRepository : BasicRepository<TrackTemplateEntity>, ITrackTemplateRepository, IScopedDependency public class TrackTemplateRepository : BasicRepository<TrackTemplateEntity>, ITrackTemplateRepository, IScopedDependency
{ {
public async Task<List<TemplateContentOrderlyDto>> GetTemplateContentOrderlyAsync(List<int> distinctTemplateIds)
{
return await Context.Queryable<TrackTemplateEntity>()
.LeftJoin<TrackTemplateContentEntity>((a, b) => a.Id == b.TrackTemplateId)
.LeftJoin<TrackContentEntity>((a, b, c) => b.TrackContentId == c.Id)
.Where(a => distinctTemplateIds.Contains(a.Id))
.OrderBy((a, b) => b.Sort)
.Select((a, b, c) => new TemplateContentOrderlyDto
{
TemplateId = a.Id,
Code = c.Code
})
.ToListAsync();
}
/// <summary> /// <summary>
/// 获取轨迹模版明细 /// 获取轨迹模版明细
/// </summary> /// </summary>
@ -40,13 +24,13 @@ public class TrackTemplateRepository : BasicRepository<TrackTemplateEntity>, ITr
.Where((a, b) => a.Id == id) .Where((a, b) => a.Id == id)
.Select((a, b) => new .Select((a, b) => new
GetTrackTemplateDetailVO GetTrackTemplateDetailVO
{ {
Id = a.Id, Id = a.Id,
Code = a.Code, Code = a.Code,
Name = a.Name, Name = a.Name,
SubSystemId = a.SubSystemId, SubSystemId = a.SubSystemId,
SubSystem = b.CnName SubSystem = b.CnName
}).FirstAsync(); }).FirstAsync();
return detail; return detail;
} }
@ -58,13 +42,14 @@ public class TrackTemplateRepository : BasicRepository<TrackTemplateEntity>, ITr
/// <returns></returns> /// <returns></returns>
public async Task<UnifyPageResultDto<GetTrackTemplateListVO>> GetPageTrackTemplate(GetPageTrackTemplateVO input) public async Task<UnifyPageResultDto<GetTrackTemplateListVO>> GetPageTrackTemplate(GetPageTrackTemplateVO input)
{ {
UnifyPageResultDto<GetTrackTemplateListVO> pagedList = new UnifyPageResultDto<GetTrackTemplateListVO>(); UnifyPageResultDto<GetTrackTemplateListVO> pagedList = await Context.Queryable<TrackTemplateEntity>()
pagedList = await Context.Queryable<TrackTemplateEntity>()
.LeftJoin<VSystemEntity>((a, b) => a.SubSystemId == b.Id) .LeftJoin<VSystemEntity>((a, b) => a.SubSystemId == b.Id)
.WhereIF(input.SubSystemId > 0, (a, b) => a.SubSystemId == input.SubSystemId) .WhereIF(input.SubSystemId > 0, (a, b) => a.SubSystemId == input.SubSystemId)
.WhereIF(!input.Keywords.IsNullOrWhiteSpace(), .WhereIF(!input.Keywords.IsNullOrWhiteSpace(),
(a, b) => a.Name.Contains(input.Keywords) || a.Code.Contains(input.Keywords)) (a, b) => a.Name.Contains(input.Keywords) || a.Code.Contains(input.Keywords))
.OrderByIF(input.TrackTemplateId > 0, (a, b) => SqlFunc.IIF(a.Id == input.TrackTemplateId, SqlFunc.DateAdd(SqlFunc.GetDate(), 1), a.CreateTime), OrderByType.Desc) .OrderByIF(input.TrackTemplateId > 0,
(a, b) => SqlFunc.IIF(a.Id == input.TrackTemplateId, SqlFunc.DateAdd(SqlFunc.GetDate(), 1),
a.CreateTime), OrderByType.Desc)
.Select((a, b) => new GetTrackTemplateListVO .Select((a, b) => new GetTrackTemplateListVO
{ {
Id = a.Id, Id = a.Id,
@ -168,7 +153,8 @@ public class TrackTemplateRepository : BasicRepository<TrackTemplateEntity>, ITr
.ExecuteCommandHasChangeAsync(); .ExecuteCommandHasChangeAsync();
} }
public async Task<List<TrackTemplateContentEntity>> GetContentListAsync(Expression<Func<TrackTemplateContentEntity, bool>> whereExpression) public async Task<List<TrackTemplateContentEntity>> GetContentListAsync(
Expression<Func<TrackTemplateContentEntity, bool>> whereExpression)
{ {
return await Context.Queryable<TrackTemplateContentEntity>().Where(whereExpression).ToListAsync(); return await Context.Queryable<TrackTemplateContentEntity>().Where(whereExpression).ToListAsync();
} }