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; using SJZY.Track.Domain.VEntities; namespace SJZY.Track.Repository.Queries; public class ProvideQueries : ISugarRepository, IProvideQueries, ITransientDependency { public ISqlSugarClient Context { get; set; } public ProvideQueries() { Context = SqlsugarScopeBasic.GetContextSafely("default"); } public async Task> GetOrderTemplateLinksAsync(int orderType, params string[] orderNumbers) { return await Context.Queryable() .LeftJoin((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> GetOrderTemplateLinksAsync(int orderType, List orderNumbers) { return await Context.Queryable() .LeftJoin((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> GetOrderedTrackCodesAsync(List templateIds) { return await Context.Queryable() .LeftJoin((a, b) => a.TrackContentId == b.Id) .Where(a => templateIds.Contains(a.TrackTemplateId)) .OrderBy(a => a.Sort) .Select((a, b) => new OrderedTrackCodeDto { TemplateId = a.TrackTemplateId, Code = b.Code, IsExternal = a.IsExternal }) .ToListAsync(); } public async Task MatchTrackContentAsync(int orderId, string code) { return await Context.Queryable() .LeftJoin((x, a) => x.TrackTemplateId == a.TrackTemplateId) .LeftJoin((x, a, b) => a.TrackContentId == b.Id) .LeftJoin((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 { Id = b.Id, Content = b.Content, EnContent = b.EnContent, Status = c.Status, IsCompleted = b.IsCompleted, IsCanDelete = a.IsCanDelete }) .FirstAsync(); } public async Task> GetCanDeleteTrackCodesAsync(List orderIds, List trackCodes) { return await Context.Queryable() .LeftJoin((x, a) => x.TrackTemplateId == a.TrackTemplateId && a.IsCanDelete) .LeftJoin((x, a, b) => a.TrackContentId == b.Id) .Where((x, a, b) => orderIds.Contains(x.OrderId) && trackCodes.Contains(b.Code) && a.IsCanDelete) .Select((x, a, b) => new CanDeleteTrackCodeVO { OrderId = x.OrderId, TrackCode = b.Code }) .ToListAsync(); } public async Task> MapTrackCodesAsync(int upSubSystemId, int subSystemId, params string[] trackCodes) { // 根据上游code得到下游code return await Context.Queryable() .Where(x => x.SubSystemId == subSystemId && x.MapSubSystemId == upSubSystemId && trackCodes.Contains(x.MapTrackContentCode)) .Select(x => x.TrackContentCode) .ToListAsync(); } public async Task> FindOrderWithServiceProviderAsync(List orderNos) { return await Context.Queryable() .LeftJoin((a, b) => a.Id == b.OrderId) .LeftJoin((a, b, c) => b.ServiceProviderId == c.Id) .Where(a => orderNos.Contains(a.OrderNo)) .Select((a, b, c) => new OrderWithServiceProviderVO { OrderNo = a.OrderNo, OrderType = a.OrderType, ServiceProviderId = b.ServiceProviderId, ServiceProviderCode = c.Code, SubSystemId = a.SubSystemId }) .ToListAsync(); } public async Task> FindOrderWithServiceProviderAsync(int serviceProvider) { return await Context.Queryable() .RightJoin((a, b) => a.Id == b.OrderId) .LeftJoin((a, b, c) => b.ServiceProviderId == c.Id) .Where((a, b) => b.ServiceProviderId == serviceProvider && !a.IsCompleted) .Select((a, b, c) => new OrderWithServiceProviderVO { OrderNo = a.OrderNo, OrderType = a.OrderType, ServiceProviderId = b.ServiceProviderId, ServiceProviderCode = c.Code, SubSystemId = a.SubSystemId }) .ToListAsync(); } }