Merge remote-tracking branch 'origin/S01-轨迹中台' into S01-轨迹中台

This commit is contained in:
李鹏军 2024-03-06 10:38:20 +08:00
commit c37cf3350f
14 changed files with 244 additions and 19 deletions

View File

@ -6,6 +6,11 @@
/// 轨迹订单id /// 轨迹订单id
/// </summary> /// </summary>
public int OrderId { get; set; } public int OrderId { get; set; }
/// <summary>
/// 子系统id
/// </summary>
public int SubSystemId { get; set; }
} }
public class TrackOrderDetailDto public class TrackOrderDetailDto
@ -49,5 +54,30 @@
/// 轨迹发生时区 /// 轨迹发生时区
/// </summary> /// </summary>
public string? TrackTimeZone { get; set; } public string? TrackTimeZone { get; set; }
/// <summary>
/// 时区的值
/// </summary>
public float TrackTimeZoneValue { get; set; }
/// <summary>
/// 是否可删
/// </summary>
public bool IsCanDelete { get; set; }
/// <summary>
/// 是否对外
/// </summary>
public bool IsExternal { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime CreateTime { get; set; }
/// <summary>
/// 创建人
/// </summary>
public string? CreateUser { get; set; }
} }
} }

View File

@ -107,4 +107,6 @@ public class TrackOrderDto
/// 子系统 /// 子系统
/// </summary> /// </summary>
public string SubSystem { get; set; } public string SubSystem { get; set; }
public int SubSystemId { get;set; }
} }

View File

@ -3,6 +3,7 @@ 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 Volo.Abp.AutoMapper;
namespace SJZY.Track.Application.AutoMapper; namespace SJZY.Track.Application.AutoMapper;
@ -21,11 +22,11 @@ public class OrderAutoMapperProfile : Profile
CreateMap<GetPageTrackOrderInput, GetPageTrackOrderInputVO>(MemberList.None); CreateMap<GetPageTrackOrderInput, GetPageTrackOrderInputVO>(MemberList.None);
CreateMap<TrackOrderVO, TrackOrderDto>(MemberList.None); CreateMap<TrackOrderVO, TrackOrderDto>(MemberList.None);
CreateMap<UnifyPageResultDto<TrackOrderVO>, UnifyPageResultDto<TrackOrderDto>>(MemberList.None); CreateMap<UnifyPageResultDto<TrackOrderVO>, UnifyPageResultDto<TrackOrderDto>>(MemberList.None);
CreateMap<TrackDetailsIndex, TrackOrderDetailDto>(MemberList.None) CreateMap<TrackDetailsIndex, TrackOrderDetailDto>(MemberList.None).Ignore(dest => dest.TrackTimeZone)
.ForMember(dest => dest.Id, opt => opt.Ignore()) .ForMember(dest => dest.Id, opt => opt.Ignore())
.ForMember(dest => dest.Code, opt => opt.MapFrom(m => m.TrackCode)) .ForMember(dest => dest.Code, opt => opt.MapFrom(m => m.TrackCode))
.ForMember(dest => dest.Content, opt => opt.MapFrom(m => m.TrackContent)) .ForMember(dest => dest.Content, opt => opt.MapFrom(m => m.TrackContent))
.ForMember(dest => dest.EnContent, opt => opt.MapFrom(m => m.TrackEnContent)) .ForMember(dest => dest.EnContent, opt => opt.MapFrom(m => m.TrackEnContent))
.ForMember(dest => dest.TrackTimeZone, opt => opt.MapFrom(m => m.TraceTimeZone.ToString())); .ForMember(dest => dest.TrackTimeZoneValue, opt => opt.MapFrom(m => m.TraceTimeZone));
} }
} }

View File

@ -13,15 +13,7 @@ public class TrackPullAutoMapperProfile : Profile
CreateMap<EditTrackPullConfigInput, TrackPushPullParamsConfigEntity>(MemberList.None).Ignore(dest => dest.Id) CreateMap<EditTrackPullConfigInput, TrackPushPullParamsConfigEntity>(MemberList.None).Ignore(dest => dest.Id)
.ForMember(dest => dest.IsPush, opt => opt.MapFrom(source => false)); .ForMember(dest => dest.IsPush, opt => opt.MapFrom(source => false));
CreateMap<UpdateTrackPullContentInput, TrackPullContentConfigEntity>(MemberList.None) CreateMap<UpdateTrackPullContentInput, TrackPullContentConfigEntity>(MemberList.None)
.ForMember(dest => dest.TrackKeyword, opt => .ForMember(dest => dest.TrackKeyword, opt => opt.MapFrom(src => string.Join(',', src.TrackKeywords)))
{ .ForMember(dest => dest.TrackKeywordReverse, opt => opt.MapFrom(src => string.Join(',', src.TrackKeywordReverses)));
opt.Condition(src => !src.TrackKeywords.IsNullOrEmpty());
opt.MapFrom(src => string.Join(',', src.TrackKeywords));
})
.ForMember(dest => dest.TrackKeywordReverse, opt =>
{
opt.Condition(src => !src.TrackKeywordReverses.IsNullOrEmpty());
opt.MapFrom(src => string.Join(',', src.TrackKeywordReverses));
});
} }
} }

View File

@ -1,7 +1,9 @@
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.TrackContentAggregate;
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 SJZY.Track.Domain.Dtos.TrackTemplate;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@ -17,19 +19,20 @@ namespace SJZY.Track.Application.Services.TrackOrders
{ {
private readonly IOrderRepository _orderRepository; private readonly IOrderRepository _orderRepository;
private readonly ITrackDetailsRepository _trackDetailsRepository; private readonly ITrackDetailsRepository _trackDetailsRepository;
private readonly ITrackContentRepository _trackContentRepository;
public TrackOrderService( public TrackOrderService(
IOrderRepository orderRepository, IOrderRepository orderRepository,
ITrackDetailsRepository trackDetailsRepository ITrackDetailsRepository trackDetailsRepository,
ITrackContentRepository trackContentRepository
) )
{ {
this._orderRepository=orderRepository; this._orderRepository=orderRepository;
this._trackDetailsRepository=trackDetailsRepository; this._trackDetailsRepository=trackDetailsRepository;
this._trackContentRepository=trackContentRepository;
} }
#region 轨迹订单明细 #region 轨迹订单明细
/// <summary> /// <summary>
/// 根据轨迹订单id获取轨迹订单明细列表 /// 根据轨迹订单id获取轨迹订单明细列表
/// </summary> /// </summary>
@ -42,10 +45,39 @@ namespace SJZY.Track.Application.Services.TrackOrders
if (!trackDetails.IsNullOrEmpty()) if (!trackDetails.IsNullOrEmpty())
{ {
var list = ObjectMapper.Map<List<TrackDetailsIndex>, List<TrackOrderDetailDto>>(trackDetails); var list = ObjectMapper.Map<List<TrackDetailsIndex>, List<TrackOrderDetailDto>>(trackDetails);
var trackCodes = list.Where(a => !a.Code.IsNullOrWhiteSpace()).Select(a => a.Code).ToList();
var trackContents = await _trackContentRepository.GetTrackContentAttributeValue(new GetTemplateContentAttributeValueInputVO
{
SubSystemId =input.SubSystemId,
TrackCodes=trackCodes
});
int id = 1; int id = 1;
list.ForEach(a => list.ForEach(a =>
{ {
a.Id = id++; a.Id = id++;
var trackContent = trackContents.FirstOrDefault(a => a.SubSystemId==input.SubSystemId&& a.TrackCode==a.TrackCode);
if (trackContent!=null)
{
a.IsCanDelete=trackContent.IsCanDelete;
a.IsExternal = trackContent.IsExternal;
}
//a.TrackTimeZoneValue=8f;
if (a.TrackTimeZoneValue==0)
{
a.TrackTimeZone=$"GTM{" "}+00:00";
}
else
{
// 将小数形式的小时转换为时区偏移量
int hours = (int)a.TrackTimeZoneValue; // 提取整数部分作为小时
int minutes = (int)((a.TrackTimeZoneValue - hours) * 60); // 将小数部分乘以 60 转换为分钟
TimeSpan offset = new TimeSpan(hours, minutes, 0);
string timeZoneStr = offset.ToString();
string flag = a.TrackTimeZoneValue>0f ? "+" : "";
a.TrackTimeZone = $"GTM{" "}{flag}{timeZoneStr.RemovePostFix(":00")}";
}
}); });
return list; return list;
} }

View File

@ -222,7 +222,7 @@ public class TrackPullService : ApplicationService, ITransientDependency
throw new BusinessException(message: _stringLocalizer["IsTrackPullContentValueAny"]); throw new BusinessException(message: _stringLocalizer["IsTrackPullContentValueAny"]);
else if (!input.TrackKeywords.IsNullOrEmpty()) else if (!input.TrackKeywords.IsNullOrEmpty())
{ {
Expression<Func<TrackPullContentConfigEntity, bool>> trackKeywordExp = _ => true; Expression<Func<TrackPullContentConfigEntity, bool>> trackKeywordExp = _ => false;
input.TrackKeywords!.ForEach(item => { trackKeywordExp = trackKeywordExp.Or(x => SqlFunc.SplitIn(x.TrackKeyword, item)); }); input.TrackKeywords!.ForEach(item => { trackKeywordExp = trackKeywordExp.Or(x => SqlFunc.SplitIn(x.TrackKeyword, item)); });
if (await _trackPullConfigRepository.IsContentAnyAsync(isContentAnyExp.And(trackKeywordExp))) if (await _trackPullConfigRepository.IsContentAnyAsync(isContentAnyExp.And(trackKeywordExp)))

View File

@ -1,4 +1,5 @@
using SJZY.Track.Domain.Dtos.TrackContents; using SJZY.Track.Domain.Dtos.TrackContents;
using SJZY.Track.Domain.Dtos.TrackTemplate;
namespace SJZY.Track.Domain.Aggregates.TrackContentAggregate; namespace SJZY.Track.Domain.Aggregates.TrackContentAggregate;
@ -24,4 +25,5 @@ public interface ITrackContentRepository : IBasicRepository<TrackContentEntity>
Task<bool> UpdateMapAsync(Expression<Func<TrackContentMapEntity, TrackContentMapEntity>> columns, Expression<Func<TrackContentMapEntity, bool>> whereExpression); Task<bool> UpdateMapAsync(Expression<Func<TrackContentMapEntity, TrackContentMapEntity>> columns, Expression<Func<TrackContentMapEntity, bool>> whereExpression);
Task<bool> GetTemplateIsExist(int trackContentId); Task<bool> GetTemplateIsExist(int trackContentId);
Task<List<GetTemplateContentAttributeValueVO>> GetTrackContentAttributeValue(GetTemplateContentAttributeValueInputVO input);
} }

View File

@ -20,4 +20,5 @@ public interface ITrackDetailsRepository
/// <param name="trackCodes"></param> /// <param name="trackCodes"></param>
/// <returns></returns> /// <returns></returns>
Task DeleteTrackAsync(int orderId, List<string> trackCodes); Task DeleteTrackAsync(int orderId, List<string> trackCodes);
Task<List<TrackDetailsIndex>?> GetListAsync(List<int> orderIds);
} }

View File

@ -114,5 +114,10 @@ namespace SJZY.Track.Domain.Dtos.Order
/// 子系统 /// 子系统
/// </summary> /// </summary>
public string SubSystem { get; set; } public string SubSystem { get; set; }
/// <summary>
/// 子系统id
/// </summary>
public int SubSystemId { get; set; }
} }
} }

View File

@ -0,0 +1,59 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SJZY.Track.Domain.Dtos.TrackTemplate
{
public class GetTemplateContentAttributeValueInputVO
{
/// <summary>
/// 子系统id
/// </summary>
public int SubSystemId { get; set; }
/// <summary>
/// 轨迹代码
/// </summary>
public List<string?>? TrackCodes { get; set; }
///// <summary>
///// 订单id
///// </summary>
//public int OrderId { get; set; }
}
public class GetTemplateContentAttributeValueVO
{
/// <summary>
/// 轨迹内容id
/// </summary>
public int TrackContenId { get; set; }
/// <summary>
/// 模版id
/// </summary>
public int TrackTemplateId { get; set; }
/// <summary>
/// 轨迹内容代码
/// </summary>
public string TrackCode { get; set; }
/// <summary>
/// 子系统id
/// </summary>
public int SubSystemId { get; set; }
/// <summary>
/// 是否可删
/// </summary>
public bool IsCanDelete { get; set; }
/// <summary>
/// 是否对外
/// </summary>
public bool IsExternal { get; set; }
}
}

View File

@ -1,5 +1,6 @@
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.TrackDetailsAggregate;
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.Domain.VEntities;
@ -9,6 +10,15 @@ namespace SJZY.Track.Repository.Repositories;
public class OrderRepository : BasicRepository<OrderEntity>, IOrderRepository, ITransientDependency public class OrderRepository : BasicRepository<OrderEntity>, IOrderRepository, ITransientDependency
{ {
private readonly ITrackDetailsRepository _trackDetailsRepository;
public OrderRepository(
ITrackDetailsRepository trackDetailsRepository
)
{
this._trackDetailsRepository=trackDetailsRepository;
}
public async Task CreateOrderAsync(OrderEntity order) public async Task CreateOrderAsync(OrderEntity order)
{ {
using var tran = TransactionHelper.GetReadCommitted(); using var tran = TransactionHelper.GetReadCommitted();
@ -147,10 +157,48 @@ public class OrderRepository : BasicRepository<OrderEntity>, IOrderRepository, I
NewestTrackTime = a.LatestTrackTime, NewestTrackTime = a.LatestTrackTime,
IsFinish = a.IsCompleted, IsFinish = a.IsCompleted,
CreateTime = a.CreateTime, CreateTime = a.CreateTime,
SubSystem = c.CnName SubSystem = c.CnName,
SubSystemId = c.Id
}) })
.ToPagedListAsync(input.PageIndex, input.PageSize); .ToPagedListAsync(input.PageIndex, input.PageSize);
if (pageList.List.Any())
{
//查询也需要最新的轨迹
var orderIds = pageList.List.Select(a => a.Id).ToList();
var esTrackDetails = await _trackDetailsRepository.GetListAsync(orderIds);
if (!esTrackDetails.IsNullOrEmpty())
{
pageList.List.ForEach(a =>
{
var esDetails = esTrackDetails.Where(b => b.OrderId== a.Id).OrderByDescending(a => a.TrackTime);
var trackDetail = esDetails.FirstOrDefault();
if (trackDetail!=null)
{
if (trackDetail.TrackContent!=a.NewestTrackContent)
{
a.NewestTrackContent=trackDetail.TrackContent;
}
if (trackDetail.TrackEnContent!=a.NewestTrackEnContent)
{
a.NewestTrackContent=trackDetail.TrackEnContent;
}
if (trackDetail.TrackPlace!=a.NewestTrackPlace)
{
a.NewestTrackPlace=trackDetail.TrackPlace;
}
if (trackDetail.TrackTime!= trackDetail.TrackTime)
{
a.NewestTrackTime=trackDetail.TrackTime;
}
}
});
}
}
#region 暂时注释 #region 暂时注释
//if (pageList.List.Any()) //if (pageList.List.Any())

View File

@ -3,6 +3,7 @@ using SJZY.Track.Domain.Aggregates.TrackFlagAggregate;
using SJZY.Track.Domain.Aggregates.TrackStatusAggregate; using SJZY.Track.Domain.Aggregates.TrackStatusAggregate;
using SJZY.Track.Domain.Aggregates.TrackTemplateAggregate; using SJZY.Track.Domain.Aggregates.TrackTemplateAggregate;
using SJZY.Track.Domain.Dtos.TrackContents; using SJZY.Track.Domain.Dtos.TrackContents;
using SJZY.Track.Domain.Dtos.TrackTemplate;
using SJZY.Track.Domain.VEntities; using SJZY.Track.Domain.VEntities;
using System.Linq; using System.Linq;
using System.Linq.Expressions; using System.Linq.Expressions;
@ -89,6 +90,31 @@ public class TrackContentRepository : BasicRepository<TrackContentEntity>, ITrac
return pagedList; return pagedList;
} }
/// <summary>
/// 获取轨迹内容属性值
/// </summary>
/// <returns></returns>
public async Task<List<GetTemplateContentAttributeValueVO>> GetTrackContentAttributeValue(GetTemplateContentAttributeValueInputVO input)
{
var list = await Context.Queryable<TrackContentEntity>()
.LeftJoin<TrackTemplateContentEntity>((a, b) => a.Id==b.TrackContentId&& b.TrackTemplateId>0 && b.IsDeleted==false)
.LeftJoin<TrackTemplateEntity>((a, b, c) => b.TrackTemplateId==c.Id&& c.IsDeleted==false)
.WhereIF(!input.TrackCodes.IsNullOrEmpty(), (a, b, c) => input.TrackCodes.Contains(a.Code))
.WhereIF(input.SubSystemId>0, (a, b, c) => a.SubSystemId==input.SubSystemId)
.Where((a, b, c) => c.Id>0)
.Select((a, b, c) => new GetTemplateContentAttributeValueVO
{
IsCanDelete=b.IsCanDelete,
IsExternal=b.IsExternal,
SubSystemId= a.SubSystemId,
TrackCode= a.Code,
TrackContenId= a.Id,
TrackTemplateId=c.Id
}).ToListAsync();
return list;
}
/// <summary> /// <summary>
/// 获取轨迹模版是否存在 /// 获取轨迹模版是否存在
/// </summary> /// </summary>
@ -115,6 +141,8 @@ public class TrackContentRepository : BasicRepository<TrackContentEntity>, ITrac
return false; return false;
} }
public async Task<UnifyPageResultDto<GetTrackContentMapPageOutputVO>> GetMapPageAsync(GetTrackContentMapPageInputVO input) public async Task<UnifyPageResultDto<GetTrackContentMapPageOutputVO>> GetMapPageAsync(GetTrackContentMapPageInputVO input)
{ {
return await Context.Queryable<TrackContentMapEntity>() return await Context.Queryable<TrackContentMapEntity>()

View File

@ -3,6 +3,7 @@ using SJZY.Expand.ABP.Core.Logger;
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;
using SJZY.UserCenter.SharedModel.Dtos.PHP.User;
namespace SJZY.Track.Repository.Repositories; namespace SJZY.Track.Repository.Repositories;
@ -52,7 +53,7 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract<TrackDetail
var r = await Context.UpdateAsync<TrackDetailsIndex>(index.Id, u => u var r = await Context.UpdateAsync<TrackDetailsIndex>(index.Id, u => u
.Index(index.IndexName) .Index(index.IndexName)
.Doc(index) .Doc(index)
//.Refresh(Refresh.True) // 可选:立即刷新索引使更改立即可见 //.Refresh(Refresh.True) // 可选:立即刷新索引使更改立即可见
); );
if (!r.IsValid) if (!r.IsValid)
@ -90,13 +91,26 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract<TrackDetail
public async Task<List<TrackDetailsIndex>?> GetListAsync(int orderId) public async Task<List<TrackDetailsIndex>?> GetListAsync(int orderId)
{ {
var data = await Context.SearchAsync<TrackDetailsIndex>(x => x.Query(q => q.Term(t => t.OrderId, orderId)) var data = await Context.SearchAsync<TrackDetailsIndex>(x => x.Query(q => q.Term(t => t.OrderId, orderId)
&& q.Term(a => a.Field(g => g.IsDeleted).Value(false))
)
.Size(1000) .Size(1000)
.Sort(s => s.Field(f => f.TrackTime, SortOrder.Descending))); .Sort(s => s.Field(f => f.TrackTime, SortOrder.Descending)));
return data?.Documents?.ToList(); return data?.Documents?.ToList();
} }
public async Task<List<TrackDetailsIndex>?> GetListAsync(List<int> orderIds)
{
var data = await Context.SearchAsync<TrackDetailsIndex>(x => x.Query(q => q.Terms(t => t.Field(g => g.OrderId).Terms(orderIds))
&& q.Term(a => a.Field(d => d.IsDeleted).Value(false))
)
.Size(10000)
.Sort(s => s.Field(c => c.TrackTime, SortOrder.Descending))
);
return data?.Documents?.ToList();
}
public async Task DeleteTrackAsync(int orderId, List<string> trackCodes) public async Task DeleteTrackAsync(int orderId, List<string> trackCodes)
{ {
var r = await Context.UpdateByQueryAsync<TrackDetailsIndex>(x => x var r = await Context.UpdateByQueryAsync<TrackDetailsIndex>(x => x

View File

@ -65,6 +65,17 @@ public class TrackTemplateRepository : BasicRepository<TrackTemplateEntity>, ITr
return pagedList; return pagedList;
} }
/// <summary>
/// 获取轨迹内容属性值
/// </summary>
/// <returns></returns>
public async Task<GetTemplateContentAttributeValueVO> GetTrackContentAttributeValue(GetTemplateContentAttributeValueInputVO input)
{
return null;
}
/// <inheritdoc/> /// <inheritdoc/>
public async Task<UnifyPageResultDto<GetTrackTemplateContentPageOutputVO>> GetContentPageAsync( public async Task<UnifyPageResultDto<GetTrackTemplateContentPageOutputVO>> GetContentPageAsync(
GetTrackTemplateContentPageInputVO input) GetTrackTemplateContentPageInputVO input)