diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetOrderDetailsInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetOrderDetailsInput.cs index 50572e48..d16e10fe 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetOrderDetailsInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetOrderDetailsInput.cs @@ -6,6 +6,11 @@ /// 轨迹订单id /// public int OrderId { get; set; } + + /// + /// 子系统id + /// + public int SubSystemId { get; set; } } public class TrackOrderDetailDto @@ -49,5 +54,30 @@ /// 轨迹发生时区 /// public string? TrackTimeZone { get; set; } + + /// + /// 时区的值 + /// + public float TrackTimeZoneValue { get; set; } + + /// + /// 是否可删 + /// + public bool IsCanDelete { get; set; } + + /// + /// 是否对外 + /// + public bool IsExternal { get; set; } + + /// + /// 创建时间 + /// + public DateTime CreateTime { get; set; } + + /// + /// 创建人 + /// + public string? CreateUser { get; set; } } } \ No newline at end of file diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetPageTrackOrderInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetPageTrackOrderInput.cs index ee323b86..5b2220d2 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetPageTrackOrderInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetPageTrackOrderInput.cs @@ -107,4 +107,6 @@ public class TrackOrderDto /// 子系统 /// public string SubSystem { get; set; } + + public int SubSystemId { get;set; } } \ No newline at end of file diff --git a/src/SJZY.Track.Application/AutoMapper/OrderAutoMapperProfile.cs b/src/SJZY.Track.Application/AutoMapper/OrderAutoMapperProfile.cs index dc814b49..5ae0e71d 100644 --- a/src/SJZY.Track.Application/AutoMapper/OrderAutoMapperProfile.cs +++ b/src/SJZY.Track.Application/AutoMapper/OrderAutoMapperProfile.cs @@ -3,6 +3,7 @@ using SJZY.Track.Application.Contract.Dtos.ProvideServices; using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Dtos.Order; +using Volo.Abp.AutoMapper; namespace SJZY.Track.Application.AutoMapper; @@ -21,11 +22,11 @@ public class OrderAutoMapperProfile : Profile CreateMap(MemberList.None); CreateMap(MemberList.None); CreateMap, UnifyPageResultDto>(MemberList.None); - CreateMap(MemberList.None) + CreateMap(MemberList.None).Ignore(dest => dest.TrackTimeZone) .ForMember(dest => dest.Id, opt => opt.Ignore()) .ForMember(dest => dest.Code, opt => opt.MapFrom(m => m.TrackCode)) .ForMember(dest => dest.Content, opt => opt.MapFrom(m => m.TrackContent)) .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)); } } \ No newline at end of file diff --git a/src/SJZY.Track.Application/AutoMapper/TrackPullAutoMapperProfile.cs b/src/SJZY.Track.Application/AutoMapper/TrackPullAutoMapperProfile.cs index dbd0f338..d8dad310 100644 --- a/src/SJZY.Track.Application/AutoMapper/TrackPullAutoMapperProfile.cs +++ b/src/SJZY.Track.Application/AutoMapper/TrackPullAutoMapperProfile.cs @@ -13,15 +13,7 @@ public class TrackPullAutoMapperProfile : Profile CreateMap(MemberList.None).Ignore(dest => dest.Id) .ForMember(dest => dest.IsPush, opt => opt.MapFrom(source => false)); CreateMap(MemberList.None) - .ForMember(dest => dest.TrackKeyword, opt => - { - 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)); - }); + .ForMember(dest => dest.TrackKeyword, opt => opt.MapFrom(src => string.Join(',', src.TrackKeywords))) + .ForMember(dest => dest.TrackKeywordReverse, opt => opt.MapFrom(src => string.Join(',', src.TrackKeywordReverses))); } } \ No newline at end of file diff --git a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs index b0c86ec2..2f04bb41 100644 --- a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs +++ b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs @@ -1,7 +1,9 @@ using SJZY.Track.Application.Contract.Dtos.ProvideServices; using SJZY.Track.Domain.Aggregates.OrderAggregate; +using SJZY.Track.Domain.Aggregates.TrackContentAggregate; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Dtos.Order; +using SJZY.Track.Domain.Dtos.TrackTemplate; using System; using System.Collections.Generic; using System.Linq; @@ -17,19 +19,20 @@ namespace SJZY.Track.Application.Services.TrackOrders { private readonly IOrderRepository _orderRepository; private readonly ITrackDetailsRepository _trackDetailsRepository; + private readonly ITrackContentRepository _trackContentRepository; public TrackOrderService( IOrderRepository orderRepository, - ITrackDetailsRepository trackDetailsRepository + ITrackDetailsRepository trackDetailsRepository, + ITrackContentRepository trackContentRepository ) { this._orderRepository=orderRepository; this._trackDetailsRepository=trackDetailsRepository; - + this._trackContentRepository=trackContentRepository; } #region 轨迹订单明细 - /// /// 根据轨迹订单id获取轨迹订单明细列表 /// @@ -42,10 +45,39 @@ namespace SJZY.Track.Application.Services.TrackOrders if (!trackDetails.IsNullOrEmpty()) { var list = ObjectMapper.Map, List>(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; list.ForEach(a => { 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; } diff --git a/src/SJZY.Track.Application/Services/TrackPull/TrackPullService.cs b/src/SJZY.Track.Application/Services/TrackPull/TrackPullService.cs index df09c551..34998b29 100644 --- a/src/SJZY.Track.Application/Services/TrackPull/TrackPullService.cs +++ b/src/SJZY.Track.Application/Services/TrackPull/TrackPullService.cs @@ -222,7 +222,7 @@ public class TrackPullService : ApplicationService, ITransientDependency throw new BusinessException(message: _stringLocalizer["IsTrackPullContentValueAny"]); else if (!input.TrackKeywords.IsNullOrEmpty()) { - Expression> trackKeywordExp = _ => true; + Expression> trackKeywordExp = _ => false; input.TrackKeywords!.ForEach(item => { trackKeywordExp = trackKeywordExp.Or(x => SqlFunc.SplitIn(x.TrackKeyword, item)); }); if (await _trackPullConfigRepository.IsContentAnyAsync(isContentAnyExp.And(trackKeywordExp))) diff --git a/src/SJZY.Track.Domain/Aggregates/TrackContentAggregate/ITrackContentRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackContentAggregate/ITrackContentRepository.cs index 511d4feb..400b7363 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackContentAggregate/ITrackContentRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackContentAggregate/ITrackContentRepository.cs @@ -1,4 +1,5 @@ using SJZY.Track.Domain.Dtos.TrackContents; +using SJZY.Track.Domain.Dtos.TrackTemplate; namespace SJZY.Track.Domain.Aggregates.TrackContentAggregate; @@ -24,4 +25,5 @@ public interface ITrackContentRepository : IBasicRepository Task UpdateMapAsync(Expression> columns, Expression> whereExpression); Task GetTemplateIsExist(int trackContentId); + Task> GetTrackContentAttributeValue(GetTemplateContentAttributeValueInputVO input); } \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsRepository.cs index d79c78df..f6578023 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsRepository.cs @@ -20,4 +20,5 @@ public interface ITrackDetailsRepository /// /// Task DeleteTrackAsync(int orderId, List trackCodes); + Task?> GetListAsync(List orderIds); } \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Dtos/Order/GetPageTrackOrderInputVO.cs b/src/SJZY.Track.Domain/Dtos/Order/GetPageTrackOrderInputVO.cs index b32b1327..b596a5e1 100644 --- a/src/SJZY.Track.Domain/Dtos/Order/GetPageTrackOrderInputVO.cs +++ b/src/SJZY.Track.Domain/Dtos/Order/GetPageTrackOrderInputVO.cs @@ -114,5 +114,10 @@ namespace SJZY.Track.Domain.Dtos.Order /// 子系统 /// public string SubSystem { get; set; } + + /// + /// 子系统id + /// + public int SubSystemId { get; set; } } } diff --git a/src/SJZY.Track.Domain/Dtos/TrackTemplate/GetTemplateContentAttributeValueInputVO.cs b/src/SJZY.Track.Domain/Dtos/TrackTemplate/GetTemplateContentAttributeValueInputVO.cs new file mode 100644 index 00000000..1ba46bf4 --- /dev/null +++ b/src/SJZY.Track.Domain/Dtos/TrackTemplate/GetTemplateContentAttributeValueInputVO.cs @@ -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 + { + /// + /// 子系统id + /// + public int SubSystemId { get; set; } + + /// + /// 轨迹代码 + /// + public List? TrackCodes { get; set; } + + ///// + ///// 订单id + ///// + //public int OrderId { get; set; } + } + + public class GetTemplateContentAttributeValueVO + { + /// + /// 轨迹内容id + /// + public int TrackContenId { get; set; } + + /// + /// 模版id + /// + public int TrackTemplateId { get; set; } + + /// + /// 轨迹内容代码 + /// + public string TrackCode { get; set; } + + /// + /// 子系统id + /// + public int SubSystemId { get; set; } + + /// + /// 是否可删 + /// + public bool IsCanDelete { get; set; } + + /// + /// 是否对外 + /// + public bool IsExternal { get; set; } + } +} diff --git a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs index b1bb6476..aa55ea33 100644 --- a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs @@ -1,5 +1,6 @@ using SJZY.Track.Domain; using SJZY.Track.Domain.Aggregates.OrderAggregate; +using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Aggregates.TrackTemplateAggregate; using SJZY.Track.Domain.Dtos.Order; using SJZY.Track.Domain.VEntities; @@ -9,6 +10,15 @@ namespace SJZY.Track.Repository.Repositories; public class OrderRepository : BasicRepository, IOrderRepository, ITransientDependency { + private readonly ITrackDetailsRepository _trackDetailsRepository; + + public OrderRepository( + ITrackDetailsRepository trackDetailsRepository + ) + { + this._trackDetailsRepository=trackDetailsRepository; + } + public async Task CreateOrderAsync(OrderEntity order) { using var tran = TransactionHelper.GetReadCommitted(); @@ -147,10 +157,48 @@ public class OrderRepository : BasicRepository, IOrderRepository, I NewestTrackTime = a.LatestTrackTime, IsFinish = a.IsCompleted, CreateTime = a.CreateTime, - SubSystem = c.CnName + SubSystem = c.CnName, + SubSystemId = c.Id }) .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 暂时注释 //if (pageList.List.Any()) diff --git a/src/SJZY.Track.Repository/Repositories/TrackContentRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackContentRepository.cs index b1a0cda0..5d4db71f 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackContentRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackContentRepository.cs @@ -3,6 +3,7 @@ using SJZY.Track.Domain.Aggregates.TrackFlagAggregate; using SJZY.Track.Domain.Aggregates.TrackStatusAggregate; using SJZY.Track.Domain.Aggregates.TrackTemplateAggregate; using SJZY.Track.Domain.Dtos.TrackContents; +using SJZY.Track.Domain.Dtos.TrackTemplate; using SJZY.Track.Domain.VEntities; using System.Linq; using System.Linq.Expressions; @@ -89,6 +90,31 @@ public class TrackContentRepository : BasicRepository, ITrac return pagedList; } + /// + /// 获取轨迹内容属性值 + /// + /// + public async Task> GetTrackContentAttributeValue(GetTemplateContentAttributeValueInputVO input) + { + var list = await Context.Queryable() + .LeftJoin((a, b) => a.Id==b.TrackContentId&& b.TrackTemplateId>0 && b.IsDeleted==false) + .LeftJoin((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; + } + /// /// 获取轨迹模版是否存在 /// @@ -115,6 +141,8 @@ public class TrackContentRepository : BasicRepository, ITrac return false; } + + public async Task> GetMapPageAsync(GetTrackContentMapPageInputVO input) { return await Context.Queryable() diff --git a/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs index cf78c66f..191de929 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs @@ -3,6 +3,7 @@ using SJZY.Expand.ABP.Core.Logger; using SJZY.Expand.ElasticSearch.Services; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Dtos.TrackDetails; +using SJZY.UserCenter.SharedModel.Dtos.PHP.User; namespace SJZY.Track.Repository.Repositories; @@ -52,7 +53,7 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract(index.Id, u => u .Index(index.IndexName) .Doc(index) - //.Refresh(Refresh.True) // 可选:立即刷新索引使更改立即可见 + //.Refresh(Refresh.True) // 可选:立即刷新索引使更改立即可见 ); if (!r.IsValid) @@ -90,13 +91,26 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract?> GetListAsync(int orderId) { - var data = await Context.SearchAsync(x => x.Query(q => q.Term(t => t.OrderId, orderId)) + var data = await Context.SearchAsync(x => x.Query(q => q.Term(t => t.OrderId, orderId) + && q.Term(a => a.Field(g => g.IsDeleted).Value(false)) + ) .Size(1000) .Sort(s => s.Field(f => f.TrackTime, SortOrder.Descending))); return data?.Documents?.ToList(); } + public async Task?> GetListAsync(List orderIds) + { + var data = await Context.SearchAsync(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 trackCodes) { var r = await Context.UpdateByQueryAsync(x => x diff --git a/src/SJZY.Track.Repository/Repositories/TrackTemplateRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackTemplateRepository.cs index 3bb1cfd9..21b72d53 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackTemplateRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackTemplateRepository.cs @@ -65,6 +65,17 @@ public class TrackTemplateRepository : BasicRepository, ITr return pagedList; } + /// + /// 获取轨迹内容属性值 + /// + /// + public async Task GetTrackContentAttributeValue(GetTemplateContentAttributeValueInputVO input) + { + + + return null; + } + /// public async Task> GetContentPageAsync( GetTrackTemplateContentPageInputVO input)