Merge pull request 'S01-轨迹中台' (#3) from S01-轨迹中台 into dev

Reviewed-on: http://192.168.80.50:3000/Dotnet/SJZY.Track.Api/pulls/3
This commit is contained in:
liuwenxiang 2024-03-01 14:11:23 +08:00
commit d29d468bc6
14 changed files with 208 additions and 52 deletions

View File

@ -37,6 +37,7 @@ namespace SJZY.Track.Api
var environment = context.Services.GetHostingEnvironment(); var environment = context.Services.GetHostingEnvironment();
var configuration = context.Services.GetConfiguration(); var configuration = context.Services.GetConfiguration();
context.Services.AddSwagger(); context.Services.AddSwagger();
//过滤器相关配置 //过滤器相关配置
context.Services.AddMvc(options => context.Services.AddMvc(options =>
{ {
@ -60,7 +61,6 @@ namespace SJZY.Track.Api
Configure<AbpJsonOptions>(options => options.OutputDateTimeFormat = "yyyy-MM-dd HH:mm:ss"); Configure<AbpJsonOptions>(options => options.OutputDateTimeFormat = "yyyy-MM-dd HH:mm:ss");
Configure<AbpAuditingOptions>(options => { options.IsEnabled = false; }); Configure<AbpAuditingOptions>(options => { options.IsEnabled = false; });
context.Services.AddRedis(); context.Services.AddRedis();
} }

View File

@ -0,0 +1,6 @@
namespace SJZY.Track.Application.Contract.Dtos.ProvideServices;
public class TrackUpsertEvent
{
public int Order { get; set; }
}

View File

@ -5,5 +5,5 @@ namespace SJZY.Track.Application.Services.ProvideServices;
public class TrackCustomer : ITransientDependency, ICapSubscribe public class TrackCustomer : ITransientDependency, ICapSubscribe
{ {
public const string CapSubscribe = "SJZY.FMC.VoucherRedundantCalc"; public const string CapSubscribe = "SJZY.Track.Upsert";
} }

View File

@ -81,6 +81,7 @@ public class TrackService : ApplicationService
} }
// 根据订单关联关系向下刷,不同子系统还需要做内容映射 // 根据订单关联关系向下刷,不同子系统还需要做内容映射
var links = await _orderRepository.GetLinkedOrderIdsAsync(orderId);
// 推送 // 推送
return true; return true;

View File

@ -57,4 +57,15 @@ public class TrackPushService : ApplicationService, ITransientDependency
{ {
return await _trackPushConfigRepository.GetDetailAsync(id); return await _trackPushConfigRepository.GetDetailAsync(id);
} }
/// <summary>
/// 轨迹推送配置内容详情
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet("GetContentDetail")]
public async Task<GetTrackPushContentDetailOutputVO> GetContentDetailAsync(int id)
{
return await _trackPushConfigRepository.GetContentDetailAsync(id);
}
} }

View File

@ -20,6 +20,30 @@ public interface IOrderRepository : IBasicRepository<OrderEntity>
/// <returns></returns> /// <returns></returns>
Task<UnifyPageResultDto<TrackOrderVO>> GetPageTrackOrder(GetPageTrackOrderInputVO input); Task<UnifyPageResultDto<TrackOrderVO>> GetPageTrackOrder(GetPageTrackOrderInputVO input);
/// <summary>
/// 更新订单
/// </summary>
/// <param name="order"></param>
/// <returns></returns>
Task UpdateOrderAsync(OrderEntity order);
/// <summary>
/// 删除订单
/// </summary>
/// <param name="orderId"></param>
/// <returns></returns>
Task DeleteOrderAsync(int orderId);
#region 订单关联
/// <summary>
/// 根据订单id,获取关联的订单id集合
/// </summary>
/// <param name="orderId"></param>
/// <returns></returns>
Task<List<int>> GetLinkedOrderIdsAsync(int orderId);
/// <summary> /// <summary>
/// 关联订单 /// 关联订单
/// </summary> /// </summary>
@ -34,17 +58,5 @@ public interface IOrderRepository : IBasicRepository<OrderEntity>
/// <returns></returns> /// <returns></returns>
Task UnLinkByIdsAsync(List<int> linkIds); Task UnLinkByIdsAsync(List<int> linkIds);
/// <summary> #endregion
/// 更新订单
/// </summary>
/// <param name="order"></param>
/// <returns></returns>
Task UpdateOrderAsync(OrderEntity order);
/// <summary>
/// 删除订单
/// </summary>
/// <param name="orderId"></param>
/// <returns></returns>
Task DeleteOrderAsync(int orderId);
} }

View File

@ -12,6 +12,18 @@ public class OrderLinkEntity : ICreateBaicEntity, ISoftDeleteBasicEntity, IEntit
[SugarColumn(ColumnName = "Id", IsPrimaryKey = true, IsIdentity = true)] [SugarColumn(ColumnName = "Id", IsPrimaryKey = true, IsIdentity = true)]
public int Id { get; set; } public int Id { get; set; }
/// <summary>
/// 订单id
/// </summary>
[SugarColumn(ColumnName = "OrderId")]
public int OrderId { get; set; }
/// <summary>
/// 关联的订单id
/// </summary>
[SugarColumn(ColumnName = "LinkOrderId")]
public int LinkOrderId { get; set; }
/// <summary> /// <summary>
/// 订单类型 /// 订单类型
/// </summary> /// </summary>
@ -24,6 +36,7 @@ public class OrderLinkEntity : ICreateBaicEntity, ISoftDeleteBasicEntity, IEntit
[SugarColumn(ColumnName = "OrderNo")] [SugarColumn(ColumnName = "OrderNo")]
public string OrderNo { get; set; } = null!; public string OrderNo { get; set; } = null!;
/// <summary> /// <summary>
/// 关联的订单类型 /// 关联的订单类型
/// </summary> /// </summary>

View File

@ -13,4 +13,5 @@ public interface ITrackDetailsRepository
Task<List<TrackDetailsIndex>> GetListAsync(int orderType, List<string> orderNos); 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);
Task<List<TrackDetailsIndex>> GetListAsync(int orderId);
} }

View File

@ -10,4 +10,6 @@ public interface ITrackPushConfigRepository : IBasicRepository<TrackPushConfigEn
Task<UnifyPageResultDto<GetTrackPushContentPageOutputVO>> GetContentPageAsync(GetTrackPushContentPageInputVO input); Task<UnifyPageResultDto<GetTrackPushContentPageOutputVO>> GetContentPageAsync(GetTrackPushContentPageInputVO input);
Task<GetTrackPushConfigDetailOutputVO> GetDetailAsync(int id); Task<GetTrackPushConfigDetailOutputVO> GetDetailAsync(int id);
Task<GetTrackPushContentDetailOutputVO> GetContentDetailAsync(int id);
} }

View File

@ -0,0 +1,61 @@
namespace SJZY.Track.Domain.Dtos.TrackPush;
public class GetTrackPushContentDetailOutputVO
{
/// <summary>
/// 轨迹内容代码
/// </summary>
public string Code { get; set; }
/// <summary>
/// 推送扩展字段
/// </summary>
public string ExpandFieldsValue { get; set; }
public int Id { get; set; }
/// <summary>
/// 推送单号类型
/// </summary>
public int OrderNoType { get; set; }
/// <summary>
/// 推送轨迹排序
/// </summary>
public int Sort { get; set; }
/// <summary>
/// 推送轨迹内容代码
/// </summary>
public string TrackContentCodeValue { get; set; }
/// <summary>
/// 轨迹内容id
/// </summary>
public int TrackContentId { get; set; }
/// <summary>
/// 推送轨迹内容
/// </summary>
public string TrackContentValue { get; set; }
/// <summary>
/// 推送轨迹内容英文
/// </summary>
public string TrackEnContentValue { get; set; }
/// <summary>
/// 轨迹推送配置id
/// </summary>
public int TrackPullConfigId { get; set; }
/// <summary>
/// 推送轨迹状态
/// </summary>
public string TrackStatusValue { get; set; }
/// <summary>
/// 推送轨迹时区
/// </summary>
public string TrackTimeZone { get; set; }
}

View File

@ -1,5 +1,4 @@
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;
@ -18,16 +17,6 @@ public class OrderRepository : BasicRepository<OrderEntity>, IOrderRepository, I
.ExecuteCommandAsync(); .ExecuteCommandAsync();
} }
public async Task LinkOrderAsync(List<OrderLinkEntity> orderLinkEntities)
{
await Context.Insertable(orderLinkEntities).ExecuteCommandAsync();
}
public async Task UnLinkByIdsAsync(List<int> linkIds)
{
await Context.Deleteable(linkIds).ExecuteCommandAsync();
}
public async Task UpdateOrderAsync(OrderEntity order) public async Task UpdateOrderAsync(OrderEntity order)
{ {
using var tran = TransactionHelper.GetReadCommitted(); using var tran = TransactionHelper.GetReadCommitted();
@ -62,6 +51,29 @@ public class OrderRepository : BasicRepository<OrderEntity>, IOrderRepository, I
tran.Complete(); tran.Complete();
} }
#region 订单关联
public async Task<List<int>> GetLinkedOrderIdsAsync(int orderId)
{
return await Context.Queryable<OrderEntity>()
.LeftJoin<OrderLinkEntity>((a, b) => a.Id == b.OrderId)
.Where(a => a.Id == orderId)
.Select((a, b) => b.LinkOrderId)
.ToListAsync();
}
public async Task LinkOrderAsync(List<OrderLinkEntity> orderLinkEntities)
{
await Context.Insertable(orderLinkEntities).ExecuteCommandAsync();
}
public async Task UnLinkByIdsAsync(List<int> linkIds)
{
await Context.Deleteable(linkIds).ExecuteCommandAsync();
}
#endregion
#region 轨迹订单明细 #region 轨迹订单明细
/// <summary> /// <summary>
@ -86,31 +98,37 @@ public class OrderRepository : BasicRepository<OrderEntity>, IOrderRepository, I
public async Task<UnifyPageResultDto<TrackOrderVO>> GetPageTrackOrder(GetPageTrackOrderInputVO input) public async Task<UnifyPageResultDto<TrackOrderVO>> GetPageTrackOrder(GetPageTrackOrderInputVO input)
{ {
var pageList = await Context.Queryable<OrderEntity>() var pageList = await Context.Queryable<OrderEntity>()
.LeftJoin<VExternalSubjectEntity>((a, b) => a.CustomId==b.Id) .LeftJoin<VExternalSubjectEntity>((a, b) => a.CustomId == b.Id)
.LeftJoin<VSystemEntity>((a, b, c) => a.SubSystemId==c.Id) .LeftJoin<VSystemEntity>((a, b, c) => a.SubSystemId == c.Id)
.WhereIF(input.SubSystemId > 0, (a, b, c) => a.SubSystemId == input.SubSystemId) .WhereIF(input.SubSystemId > 0, (a, b, c) => a.SubSystemId == input.SubSystemId)
.WhereIF(!input.OrderNos.IsNullOrEmpty(), (a, b, c) => input.OrderNos.Contains(a.OrderNo)) .WhereIF(!input.OrderNos.IsNullOrEmpty(), (a, b, c) => input.OrderNos.Contains(a.OrderNo))
.WhereIF(input.CreateTimeStart.HasValue&& input.CreateTimeEnd.HasValue, (a, b, c) => a.CreateTime>= input.CreateTimeStart && a.CreateTime<= input.CreateTimeEnd) .WhereIF(input.CreateTimeStart.HasValue && input.CreateTimeEnd.HasValue,
.WhereIF(input.CreateTimeStart.HasValue&& (!input.CreateTimeEnd.HasValue), (a, b, c) => a.CreateTime>= input.CreateTimeStart) (a, b, c) => a.CreateTime >= input.CreateTimeStart && a.CreateTime <= input.CreateTimeEnd)
.WhereIF((!input.CreateTimeStart.HasValue)&& input.CreateTimeEnd.HasValue, (a, b, c) => a.CreateTime<= input.CreateTimeEnd) .WhereIF(input.CreateTimeStart.HasValue && (!input.CreateTimeEnd.HasValue),
.Select((a, b, c) => new TrackOrderVO (a, b, c) => a.CreateTime >= input.CreateTimeStart)
{ .WhereIF((!input.CreateTimeStart.HasValue) && input.CreateTimeEnd.HasValue,
Id = a.Id, (a, b, c) => a.CreateTime <= input.CreateTimeEnd)
OrderNumber= a.OrderNo, .Select((a, b, c) => new TrackOrderVO
OrderType = a.OrderType, {
CustomerShortName= b.Abbreviation, Id = a.Id,
CustomerCode= b.Code, OrderNumber = a.OrderNo,
TrackTemplateNames = SqlFunc.Subqueryable<OrderTemplateEntity>().LeftJoin<TrackTemplateEntity>((aa, bb) => aa.TrackTemplateId==bb.Id) OrderType = a.OrderType,
.Where((aa, bb) => a.Id==aa.OrderId).SelectStringJoin((aa, bb) => bb.Name, ","), CustomerShortName = b.Abbreviation,
NewestTrackContent= a.LatestTrackContent, CustomerCode = b.Code,
NewestTrackEnContent= a.LatestTrackEnContent, TrackTemplateNames = SqlFunc.Subqueryable<OrderTemplateEntity>()
NewestTrackPlace= a.LatestTrackPlace, .LeftJoin<TrackTemplateEntity>((aa, bb) => aa.TrackTemplateId == bb.Id)
IsFinish=a.IsCompleted, .Where((aa, bb) => a.Id == aa.OrderId).SelectStringJoin((aa, bb) => bb.Name, ","),
CreateTime=a.CreateTime, NewestTrackContent = a.LatestTrackContent,
SubSystem= c.CnName NewestTrackEnContent = a.LatestTrackEnContent,
}) NewestTrackPlace = a.LatestTrackPlace,
.ToPagedListAsync(input.PageIndex, input.PageSize); IsFinish = a.IsCompleted,
CreateTime = a.CreateTime,
SubSystem = c.CnName
})
.ToPagedListAsync(input.PageIndex, input.PageSize);
#region 暂时注释 #region 暂时注释
//if (pageList.List.Any()) //if (pageList.List.Any())
//{ //{
// var orderIds = pageList.List.Select(a => a.Id); // var orderIds = pageList.List.Select(a => a.Id);
@ -129,7 +147,9 @@ public class OrderRepository : BasicRepository<OrderEntity>, IOrderRepository, I
// a.TrackTemplateNames = templateListOfOrderId.Select(c => c.Name).JoinAsString(","); // a.TrackTemplateNames = templateListOfOrderId.Select(c => c.Name).JoinAsString(",");
// }); // });
//} //}
#endregion #endregion
return pageList; return pageList;
} }

View File

@ -37,7 +37,7 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract<TrackDetail
var response = await Context.UpdateAsync<TrackDetailsIndex>(index.Id, u => u var response = await Context.UpdateAsync<TrackDetailsIndex>(index.Id, u => u
.Index(IndexName) .Index(IndexName)
.Doc(index) .Doc(index)
//.Refresh(Refresh.True) // 可选:立即刷新索引使更改立即可见 //.Refresh(Refresh.True) // 可选:立即刷新索引使更改立即可见
); );
if (!response.IsValid) if (!response.IsValid)
throw new Exception($"数据修改失败,原因:{response.DebugInformation}"); throw new Exception($"数据修改失败,原因:{response.DebugInformation}");
@ -73,6 +73,21 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract<TrackDetail
return data.Documents.ToList(); return data.Documents.ToList();
} }
public async Task<List<TrackDetailsIndex>> GetListAsync(int orderId)
{
var data = await Context.SearchAsync<TrackDetailsIndex>(x => x
.Source(s => s.Includes(fd => fd
.Field(f => f.TrackStatus)
.Field(f => f.TrackCode)
.Field(f => f.TrackContent)
.Field(f => f.TrackPlace)
.Field(f => f.TrackTime)
.Field(f => f.TraceTimeZone)
)).Query(q => q.Terms(t => t.Field(f => f.OrderId).Terms(orderId))));
return data?.Documents?.ToList();
}
public async Task<(List<TrackDetailsIndex> list, long total)> GetListAsync(TrackDetailsQueryInput input) public async Task<(List<TrackDetailsIndex> list, long total)> GetListAsync(TrackDetailsQueryInput input)
{ {
if (input.OrderNos.Count < 1) return default; if (input.OrderNos.Count < 1) return default;

View File

@ -69,4 +69,17 @@ public class TrackPushConfigRepository : BasicRepository<TrackPushConfigEntity>,
}, true) }, true)
.SingleAsync(); .SingleAsync();
} }
public async Task<GetTrackPushContentDetailOutputVO> GetContentDetailAsync(int id)
{
return await Context.Queryable<TrackPushContentConfigEntity>()
.InnerJoin<TrackContentEntity>((pushContent, trackContent) => pushContent.TrackContentId == trackContent.Id)
.Where(pushContent => pushContent.Id == id)
.Select((pushContent, trackContent) => new GetTrackPushContentDetailOutputVO
{
Id = pushContent.Id,
Code = trackContent.Code + "-" + trackContent.Content,
}, true)
.SingleAsync();
}
} }

View File

@ -4,6 +4,7 @@
<TargetFramework>net7.0</TargetFramework> <TargetFramework>net7.0</TargetFramework>
<GenerateDocumentationFile>True</GenerateDocumentationFile> <GenerateDocumentationFile>True</GenerateDocumentationFile>
<LangVersion>preview</LangVersion> <LangVersion>preview</LangVersion>
<AssemblyName>SJZY.Track.Repository</AssemblyName>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>