Merge branch 'S01-轨迹中台' into test
This commit is contained in:
commit
d6be85d049
@ -23,7 +23,7 @@ public class TrackDeleteEventHandler: ITransientDependency, ICapSubscribe
|
||||
_capPublisher = capPublisher;
|
||||
}
|
||||
|
||||
[CapSubscribe(GlobalConst.TrackUpsertSubscribe)]
|
||||
[CapSubscribe(GlobalConst.TrackDeleteSubscribe)]
|
||||
public async Task ConsumerAsync(TrackDeleteEvent @event)
|
||||
{
|
||||
// 不同子系统需要做内容映射
|
||||
|
||||
@ -13,6 +13,10 @@
|
||||
<PackageReference Include="Volo.Abp.FluentValidation" Version="7.0.2" />
|
||||
<PackageReference Include="SJZY.UserCenter.HttpApi" Version="3.0.3-alpha8" />
|
||||
<PackageReference Include="SJZY.Expand.CAP" Version="7.8.0" />
|
||||
<PackageReference Include="DotNetCore.CAP" Version="8.0.1" />
|
||||
<PackageReference Include="DotNetCore.CAP.Dashboard" Version="8.0.1" />
|
||||
<PackageReference Include="DotNetCore.CAP.RabbitMQ" Version="8.0.1" />
|
||||
<PackageReference Include="DotNetCore.CAP.MySql" Version="8.0.1" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@ -8,6 +8,7 @@ namespace SJZY.Track.Application.Services.ProvideServices;
|
||||
/// 订单关联服务
|
||||
/// </summary>
|
||||
[ApiExplorerSettings(GroupName = "提供接口")]
|
||||
[Route("/ProviderService")]
|
||||
public class OrderLinkService : ApplicationService
|
||||
{
|
||||
private readonly IOrderRepository _orderRepository;
|
||||
@ -34,6 +35,12 @@ public class OrderLinkService : ApplicationService
|
||||
throw new BusinessException(message: $"订单:{input.OrderNo}不存在");
|
||||
}
|
||||
|
||||
//todo:循环关联?
|
||||
if (input.OrderType == input.LinkOrderType)
|
||||
{
|
||||
throw new BusinessException(message: "不能同级关联");
|
||||
}
|
||||
|
||||
if (input.LinkOrderNos.Count < 1 || input.LinkOrderType == 0) return true;
|
||||
|
||||
// 单号去重
|
||||
|
||||
@ -2,7 +2,6 @@
|
||||
using SJZY.Track.Domain.Aggregates.OrderAggregate;
|
||||
using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
|
||||
using SJZY.Track.Domain.Dtos.Order;
|
||||
using Volo.Abp.ObjectMapping;
|
||||
|
||||
namespace SJZY.Track.Application.Services.ProvideServices;
|
||||
|
||||
@ -10,6 +9,7 @@ namespace SJZY.Track.Application.Services.ProvideServices;
|
||||
/// 订单服务
|
||||
/// </summary>
|
||||
[ApiExplorerSettings(GroupName = "提供接口")]
|
||||
[Route("/ProviderService")]
|
||||
public class OrderService : ApplicationService
|
||||
{
|
||||
private readonly IOrderRepository _orderRepository;
|
||||
|
||||
@ -9,6 +9,7 @@ namespace SJZY.Track.Application.Services.ProvideServices;
|
||||
/// 轨迹拉取服务
|
||||
/// </summary>
|
||||
[ApiExplorerSettings(GroupName = "提供接口")]
|
||||
[Route("/ProviderService")]
|
||||
public class TrackPullService : ApplicationService
|
||||
{
|
||||
private readonly IOrderRepository _orderRepository;
|
||||
|
||||
@ -4,6 +4,7 @@
|
||||
/// 轨迹推送服务
|
||||
/// </summary>
|
||||
[ApiExplorerSettings(GroupName = "提供接口")]
|
||||
[Route("/ProviderService")]
|
||||
public class TrackPushService: ApplicationService
|
||||
{
|
||||
|
||||
|
||||
@ -10,6 +10,7 @@ namespace SJZY.Track.Application.Services.ProvideServices;
|
||||
/// 轨迹查询服务
|
||||
/// </summary>
|
||||
[ApiExplorerSettings(GroupName = "提供接口")]
|
||||
[Route("/ProviderService")]
|
||||
public class TrackQueryService : ApplicationService
|
||||
{
|
||||
private readonly ITrackDetailsRepository _trackDetailsRepository;
|
||||
|
||||
@ -10,6 +10,7 @@ namespace SJZY.Track.Application.Services.ProvideServices;
|
||||
/// 轨迹服务
|
||||
/// </summary>
|
||||
[ApiExplorerSettings(GroupName = "提供接口")]
|
||||
[Route("/ProviderService")]
|
||||
public class TrackService : ApplicationService
|
||||
{
|
||||
private readonly IOrderRepository _orderRepository;
|
||||
@ -85,7 +86,7 @@ public class TrackService : ApplicationService
|
||||
TrackCodes = codes,
|
||||
SubSystemId = order.SubSystemId,
|
||||
};
|
||||
await _capPublisher.PublishAsync(GlobalConst.TrackUpsertSubscribe, @event);
|
||||
await _capPublisher.PublishAsync(GlobalConst.TrackDeleteSubscribe, @event);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -1,4 +1,7 @@
|
||||
using SJZY.Expand.ABP.Core.Localization;
|
||||
using DotNetCore.CAP;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using SJZY.Expand.ABP.Core.Localization;
|
||||
using SJZY.Expand.ABP.Core.Logger;
|
||||
using SJZY.InterfaceRelay.Application.Contracts;
|
||||
using SJZY.Track.Application.Contract;
|
||||
using SJZY.Track.Application.Localization;
|
||||
@ -67,19 +70,41 @@ namespace SJZY.Track.Application
|
||||
remoteServiceConfigurationName: "InterfaceForward",
|
||||
asDefaultService: false
|
||||
);
|
||||
|
||||
//CAP
|
||||
context.Services.AddCapTableNameService();
|
||||
context.Services.AddCap(options =>
|
||||
{
|
||||
options.UseMySql(configuration["ConnectionStrings:DefaultConnection"]!);
|
||||
options.UseRabbitMQ(configure =>
|
||||
{
|
||||
configure.HostName = configuration["RabbitMQ:HostName"]!;
|
||||
configure.UserName = configuration["RabbitMQ:UserName"]!;
|
||||
configure.Password = configuration["RabbitMQ:Password"]!;
|
||||
configure.Port = configuration.GetValue<int>("RabbitMQ:Port");
|
||||
});
|
||||
options.FailedRetryInterval = 60;
|
||||
options.FailedRetryCount = 10;
|
||||
options.UseDashboard(dashboardOptions =>
|
||||
{
|
||||
dashboardOptions.PathBase = System.Diagnostics.Debugger.IsAttached ? "" : configuration["Swagger:JsonUrlPrefix"];
|
||||
});
|
||||
options.FailedThresholdCallback = faileCalback =>
|
||||
{
|
||||
LogHelper.Error($@"{faileCalback.MessageType} 失败了,消息名称: {faileCalback.Message}");
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
public override void PreConfigureServices(ServiceConfigurationContext context)
|
||||
{
|
||||
var configuration = context.Services.GetConfiguration();
|
||||
PreConfigure<AbpHttpClientBuilderOptions>(options =>
|
||||
{
|
||||
options.ProxyClientActions.Add(async (remoteName, serviceProvider, httpClient) =>
|
||||
options.ProxyClientActions.Add((_, _, httpClient) =>
|
||||
{
|
||||
//如果设置Token,前端需要传入Token 否则引发异常
|
||||
httpClient.SetTokenHeader();
|
||||
httpClient.Timeout = TimeSpan.FromMinutes(3);
|
||||
await Task.CompletedTask;
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@ -9,9 +9,7 @@ public interface IOrderRepository : IBasicRepository<OrderEntity>
|
||||
/// </summary>
|
||||
/// <param name="order"></param>
|
||||
/// <returns></returns>
|
||||
Task<bool> CreateOrderAsync(OrderEntity order);
|
||||
|
||||
//Task<List<TrackOrderDetailVO>> GetOrderDetails(GetOrderDetailsInputVO input);
|
||||
Task CreateOrderAsync(OrderEntity order);
|
||||
|
||||
/// <summary>
|
||||
/// 获取分页的轨迹订单
|
||||
|
||||
@ -114,9 +114,8 @@ public class OrderEntity : IFullAuditedBasicEntitys, IAggregateRoot
|
||||
[SugarColumn(ColumnName = "LeavePort")]
|
||||
public string? LeavePort { get; set; }
|
||||
|
||||
[Navigate(NavigateType.OneToMany, nameof(OrderFlightEntity.OrderId))]
|
||||
[SugarColumn(IsIgnore = true)]
|
||||
public List<OrderFlightEntity> OrderFlights { get; set; }
|
||||
|
||||
[Navigate(NavigateType.OneToMany, nameof(OrderFlightEntity.OrderId))]
|
||||
[SugarColumn(IsIgnore = true)]
|
||||
public List<OrderTemplateEntity> OrderTemplates { get; set; }
|
||||
}
|
||||
@ -11,7 +11,7 @@ public interface ITrackDetailsRepository
|
||||
Task<List<TrackDetailsIndex>> GetListAsync(int orderType, List<string> orderNos);
|
||||
|
||||
Task<(List<TrackDetailsIndex> list, long total)> GetListAsync(TrackDetailsQueryInput input);
|
||||
Task<List<TrackDetailsIndex>> GetListAsync(int orderId);
|
||||
Task<List<TrackDetailsIndex>?> GetListAsync(int orderId);
|
||||
|
||||
/// <summary>
|
||||
/// 删除轨迹
|
||||
|
||||
@ -59,7 +59,7 @@ public class TrackDetailsIndex : IdBaseIndex
|
||||
/// <summary>
|
||||
/// 轨迹发生地
|
||||
/// </summary>
|
||||
public string? TrackPlace { get; set; }
|
||||
public string TrackPlace { get; set; } = null!;
|
||||
|
||||
/// <summary>
|
||||
/// 轨迹发生时间
|
||||
|
||||
@ -9,12 +9,17 @@ namespace SJZY.Track.Repository.Repositories;
|
||||
|
||||
public class OrderRepository : BasicRepository<OrderEntity>, IOrderRepository, ITransientDependency
|
||||
{
|
||||
public async Task<bool> CreateOrderAsync(OrderEntity order)
|
||||
public async Task CreateOrderAsync(OrderEntity order)
|
||||
{
|
||||
return await Context.InsertNav(order)
|
||||
.Include(x => x.OrderFlights)
|
||||
.Include(x => x.OrderTemplates)
|
||||
.ExecuteCommandAsync();
|
||||
using var tran = TransactionHelper.GetReadCommitted();
|
||||
|
||||
var orderId = await InsertReturnIdentityAsync(order);
|
||||
order.OrderTemplates.ForEach(x => x.OrderId = orderId);
|
||||
await Context.Insertable(order.OrderTemplates).ExecuteCommandAsync();
|
||||
order.OrderFlights.ForEach(x => x.OrderId = orderId);
|
||||
await Context.Insertable(order.OrderFlights).ExecuteCommandAsync();
|
||||
|
||||
tran.Complete();
|
||||
}
|
||||
|
||||
public async Task UpdateOrderAsync(OrderEntity order)
|
||||
|
||||
@ -1,4 +1,6 @@
|
||||
using Nest;
|
||||
using SJZY.Expand.ABP.Core.Logger;
|
||||
using SJZY.Expand.ABP.Core.PublicMethords;
|
||||
using SJZY.Expand.ElasticSearch.Services;
|
||||
using SJZY.Track.Domain;
|
||||
using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
|
||||
@ -9,8 +11,6 @@ namespace SJZY.Track.Repository.Repositories;
|
||||
internal class TrackDetailsRepository : ElasticSearchContextAbstract<TrackDetailsIndex>, ITrackDetailsRepository,
|
||||
ITransientDependency
|
||||
{
|
||||
public string IndexName => $"{GlobalConst.TrackIndex}-{DateTime.Now:yyyy.MM.dd}";
|
||||
|
||||
public TrackDetailsRepository(ConnectionFactory connectionFactory) : base(connectionFactory)
|
||||
{
|
||||
}
|
||||
@ -18,32 +18,46 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract<TrackDetail
|
||||
public async Task<TrackDetailsIndex?> GetFirstOrDefaultAsync(int orderId, string trackCode)
|
||||
{
|
||||
var r = await Context.SearchAsync<TrackDetailsIndex>(s => s
|
||||
.Index(IndexName)
|
||||
.Source()
|
||||
.Query(q =>
|
||||
q.Term(t => t.Field(f => f.OrderId).Value(orderId))
|
||||
&& q.Term(t => t.Field(f => f.TrackCode).Value(trackCode))
|
||||
&& q.Term(t => t.Field(f => f.IsDeleted).Value(true))
|
||||
q.Term(f => f.OrderId, orderId)
|
||||
&& q.Term(f => f.TrackCode.Suffix("keyword"), trackCode)
|
||||
&& q.Term(f => f.IsDeleted, false)
|
||||
)
|
||||
);
|
||||
|
||||
if (r.IsValid)
|
||||
var res= r.Documents.FirstOrDefault();
|
||||
if (r.Hits.FirstOrDefault() != default && res != default)
|
||||
{
|
||||
return r.Documents.FirstOrDefault();
|
||||
res.Id = r.Hits.FirstOrDefault()!.Id;
|
||||
}
|
||||
|
||||
return default;
|
||||
return res;
|
||||
}
|
||||
|
||||
public async Task UpsertAsync(TrackDetailsIndex index)
|
||||
{
|
||||
var response = await Context.UpdateAsync<TrackDetailsIndex>(index.Id, u => u
|
||||
.Index(IndexName)
|
||||
try
|
||||
{
|
||||
if (index.Id.IsNullOrWhiteSpace())
|
||||
{
|
||||
// 按天写入es
|
||||
await Context.IndexAsync(index, request => request
|
||||
.Index($"{GlobalConst.TrackIndex}-{DateTime.Now:yyyy.MM.dd}")
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
await Context.UpdateAsync<TrackDetailsIndex>(index.Id, u => u
|
||||
.Doc(index)
|
||||
.DocAsUpsert()
|
||||
//.Refresh(Refresh.True) // 可选:立即刷新索引使更改立即可见
|
||||
);
|
||||
if (!response.IsValid)
|
||||
throw new Exception($"数据修改失败,原因:{response.DebugInformation}");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogHelper.Error($"轨迹数据新增/修改失败,原因:{ex.Message}。\n{index.ToJson()}");
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<List<TrackDetailsIndex>> GetListAsync(int orderType, List<string> orderNos)
|
||||
@ -61,17 +75,17 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract<TrackDetail
|
||||
))
|
||||
.Query(q =>
|
||||
q.Terms(t => t
|
||||
.Field(f => f.OrderNo)
|
||||
.Field(f => f.OrderNo.Suffix("keyword"))
|
||||
.Terms(orderNos))
|
||||
&& q.Term(f => f.OrderType, orderType)
|
||||
&& q.Term(t => t.Field(f => f.IsDeleted).Value(true))
|
||||
&& q.Term(t => t.Field(f => f.IsDeleted).Value(false))
|
||||
)
|
||||
);
|
||||
|
||||
return data.Documents.ToList();
|
||||
}
|
||||
|
||||
public async Task<List<TrackDetailsIndex>> GetListAsync(int orderId)
|
||||
public async Task<List<TrackDetailsIndex>?> GetListAsync(int orderId)
|
||||
{
|
||||
var data = await Context.SearchAsync<TrackDetailsIndex>(x => x
|
||||
.Source(s => s.Includes(fd => fd
|
||||
@ -83,7 +97,7 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract<TrackDetail
|
||||
.Field(f => f.TraceTimeZone)
|
||||
)).Query(q =>
|
||||
q.Terms(t => t.Field(f => f.OrderId).Terms(orderId))
|
||||
&& q.Term(t => t.Field(f => f.IsDeleted).Value(true))
|
||||
&& q.Term(t => t.Field(f => f.IsDeleted).Value(false))
|
||||
)
|
||||
);
|
||||
|
||||
@ -98,7 +112,7 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract<TrackDetail
|
||||
q.Term(t => t.OrderId, orderId)
|
||||
&& q.Terms(t => t.Field(f => f.TrackCode).Terms(trackCodes)))
|
||||
.Script(s => s
|
||||
.Source("ctx._source.IsDeleted = true"))
|
||||
.Source("ctx._source.isDeleted = true"))
|
||||
);
|
||||
}
|
||||
|
||||
@ -114,7 +128,7 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract<TrackDetail
|
||||
q.Terms(t => t
|
||||
.Field(f => f.OrderNo)
|
||||
.Terms(distinctOrderNumbers))
|
||||
&& q.Term(t => t.Field(f => f.IsDeleted).Value(true))
|
||||
&& q.Term(t => t.Field(f => f.IsDeleted).Value(false))
|
||||
)
|
||||
.Sort(s => s.Field(f => f.CreateTime, SortOrder.Descending))
|
||||
.From((input.PageIndex - 1) * input.PageSize)
|
||||
|
||||
@ -39,6 +39,10 @@ public class SjzyTrackRepositoryModule : AbpModule
|
||||
|
||||
context.Services.AddElasticSearch(options =>
|
||||
{
|
||||
if (System.Diagnostics.Debugger.IsAttached)
|
||||
{
|
||||
options.ShowLogInfo = true;
|
||||
}
|
||||
options.NodeUrls = configuration.GetSection("ElasticSearch:NodeUrls").Get<List<string>>()!;
|
||||
options.LoginName = configuration["ElasticSearch:LoginName"]!;
|
||||
options.Password = configuration["ElasticSearch:Password"]!;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user