Merge branch 'test' of http://192.168.80.50:3000/Dotnet/SJZY.Track.Api into test
This commit is contained in:
commit
23bdae7520
@ -7,8 +7,8 @@
|
||||
}
|
||||
},
|
||||
"ConnectionStrings": {
|
||||
"DefaultConnection": "server=192.168.80.84;Database=sjzy_package_setting;Uid=sjzy_test_user;Pwd=848c1c31;AllowLoadLocalInfile=true;SslMode=None;Charset=utf8mb4;",
|
||||
"canalView": "server=192.168.80.84;Database=sjzy_data_center;Uid=sjzy_test_user;Pwd=848c1c31;AllowLoadLocalInfile=true;SslMode=None;Charset=utf8mb4;"
|
||||
"DefaultConnection": "server=mysql-test.default.svc.cluster.local;Database=sjzy_track;Uid=sjzy_test_user;Pwd=848c1c31;AllowLoadLocalInfile=true;SslMode=None;Charset=utf8mb4;",
|
||||
"canalView": "server=mysql-test.default.svc.cluster.local;Database=sjzy_track;Uid=sjzy_test_user;Pwd=848c1c31;AllowLoadLocalInfile=true;SslMode=None;Charset=utf8mb4;"
|
||||
},
|
||||
"Redis": {
|
||||
"ConnectionString": "192.168.80.58:6379,abortConnect=false",
|
||||
|
||||
@ -3,3 +3,11 @@
|
||||
public class DeleteOrderInput : OrderNoInfo
|
||||
{
|
||||
}
|
||||
|
||||
public class DeleteTrackInput : OrderNoInfo
|
||||
{
|
||||
/// <summary>
|
||||
/// 轨迹code
|
||||
/// </summary>
|
||||
public List<string> TrackCodes { get; set; } = new();
|
||||
}
|
||||
@ -56,6 +56,11 @@
|
||||
/// </summary>
|
||||
public string SubSystem { set; get; }
|
||||
|
||||
/// <summary>
|
||||
/// 子系统id
|
||||
/// </summary>
|
||||
public int SubSystemId { set; get; }
|
||||
|
||||
/// <summary>
|
||||
/// 创建时间
|
||||
/// </summary>
|
||||
|
||||
@ -0,0 +1,24 @@
|
||||
namespace SJZY.Track.Application.Contract.Events;
|
||||
|
||||
public class TrackDeleteEvent
|
||||
{
|
||||
/// <summary>
|
||||
/// 订单id
|
||||
/// </summary>
|
||||
public int OrderId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 轨迹代码
|
||||
/// </summary>
|
||||
public List<string> TrackCodes { get; set; } = null!;
|
||||
|
||||
/// <summary>
|
||||
/// 子系统id
|
||||
/// </summary>
|
||||
public int SubSystemId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 上游子系统id
|
||||
/// </summary>
|
||||
public int UpSubSystemId { get; set; }
|
||||
}
|
||||
@ -0,0 +1,67 @@
|
||||
using DotNetCore.CAP;
|
||||
using SJZY.Expand.ABP.Core.PublicMethords;
|
||||
using SJZY.Track.Application.Contract.Events;
|
||||
using SJZY.Track.Domain.Aggregates.OrderAggregate;
|
||||
using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
|
||||
using SJZY.Track.Domain.Queries;
|
||||
using Volo.Abp.DependencyInjection;
|
||||
|
||||
namespace SJZY.Track.Application.EventHandlers;
|
||||
|
||||
public class TrackDeleteEventHandler: ITransientDependency, ICapSubscribe
|
||||
{
|
||||
private readonly IOrderRepository _orderRepository;
|
||||
private readonly IProvideQueries _provideQueries;
|
||||
private readonly ITrackDetailsRepository _trackDetailsRepository;
|
||||
private readonly ICapPublisher _capPublisher;
|
||||
|
||||
public TrackDeleteEventHandler(IProvideQueries provideQueries, ITrackDetailsRepository trackDetailsRepository, IOrderRepository orderRepository, ICapPublisher capPublisher)
|
||||
{
|
||||
_provideQueries = provideQueries;
|
||||
_trackDetailsRepository = trackDetailsRepository;
|
||||
_orderRepository = orderRepository;
|
||||
_capPublisher = capPublisher;
|
||||
}
|
||||
|
||||
[CapSubscribe(GlobalConst.TrackUpsertSubscribe)]
|
||||
public async Task ConsumerAsync(TrackDeleteEvent @event)
|
||||
{
|
||||
// 不同子系统需要做内容映射
|
||||
if (@event.UpSubSystemId != 0 && @event.UpSubSystemId != @event.SubSystemId)
|
||||
{
|
||||
var mapCodes = await _provideQueries
|
||||
.MapTrackCodesAsync(@event.UpSubSystemId, @event.SubSystemId, @event.TrackCodes.ToArray());
|
||||
|
||||
if (mapCodes.Count == 0)
|
||||
{
|
||||
//throw new BusinessException(message: "订单跨子系统,未配置内容映射,请联系管理员");
|
||||
return;
|
||||
}
|
||||
|
||||
@event.TrackCodes = mapCodes;
|
||||
}
|
||||
|
||||
await DeleteTrackAsync(@event);
|
||||
}
|
||||
|
||||
private async Task DeleteTrackAsync(TrackDeleteEvent @event)
|
||||
{
|
||||
// 删除轨迹
|
||||
await _trackDetailsRepository.DeleteTrackAsync(@event.OrderId, @event.TrackCodes);
|
||||
|
||||
// 根据订单关联关系异步向下刷
|
||||
var linkedOrders = await _orderRepository.GetLinkedOrdersAsync(@event.OrderId);
|
||||
foreach (var linkedOrder in linkedOrders)
|
||||
{
|
||||
var nextEvent = new TrackDeleteEvent
|
||||
{
|
||||
OrderId = linkedOrder.OrderId,
|
||||
TrackCodes = @event.TrackCodes,
|
||||
SubSystemId = linkedOrder.SubSystemId,
|
||||
UpSubSystemId = @event.SubSystemId
|
||||
};
|
||||
|
||||
await _capPublisher.PublishAsync(GlobalConst.TrackDeleteSubscribe, nextEvent);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -33,10 +33,11 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
|
||||
public async Task ConsumerAsync(TrackUpsertEvent @event)
|
||||
{
|
||||
// 不同子系统需要做内容映射
|
||||
if (@event.UpSubSystemId != @event.SubSystemId)
|
||||
if (@event.UpSubSystemId != 0 && @event.UpSubSystemId != @event.SubSystemId)
|
||||
{
|
||||
var mapCode = await _provideQueries
|
||||
.MapTrackContentCodeAsync(@event.UpSubSystemId, @event.SubSystemId, @event.TrackCode);
|
||||
var mapCode = (await _provideQueries
|
||||
.MapTrackCodesAsync(@event.UpSubSystemId, @event.SubSystemId, @event.TrackCode))
|
||||
.FirstOrDefault();
|
||||
|
||||
if (mapCode == default)
|
||||
{
|
||||
@ -50,7 +51,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
|
||||
await UpsertTrackAsync(@event);
|
||||
}
|
||||
|
||||
internal async Task UpsertTrackAsync(TrackUpsertEvent @event)
|
||||
private async Task UpsertTrackAsync(TrackUpsertEvent @event)
|
||||
{
|
||||
// 不存在则新增轨迹,存在则更新
|
||||
var track = await _trackDetailsRepository.GetFirstOrDefaultAsync(@event.OrderId, @event.TrackCode);
|
||||
@ -65,6 +66,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
|
||||
//throw new BusinessException(message: $"订单:{@event.OrderNo} 所绑定的模板,没有一条内容可以匹配轨迹代码:{@event.TrackCode}");
|
||||
return;
|
||||
}
|
||||
|
||||
orderIsCompleted = trackContent.IsCompleted;
|
||||
|
||||
track = new TrackDetailsIndex
|
||||
|
||||
@ -20,7 +20,7 @@ public class OrderService : ApplicationService
|
||||
)
|
||||
{
|
||||
_orderRepository = orderRepository;
|
||||
this._trackDetailsRepository=trackDetailsRepository;
|
||||
_trackDetailsRepository = trackDetailsRepository;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -94,7 +94,6 @@ public class OrderService : ApplicationService
|
||||
#endregion
|
||||
|
||||
#region 轨迹订单列表
|
||||
|
||||
/// <summary>
|
||||
/// 获取分页的轨迹订单
|
||||
/// </summary>
|
||||
@ -109,7 +108,6 @@ public class OrderService : ApplicationService
|
||||
ObjectMapper.Map<UnifyPageResultDto<TrackOrderVO>, UnifyPageResultDto<TrackOrderDto>>(pageList);
|
||||
return pageResultDto;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private async Task UpdateOrderAsync(UpdateOrderInput input, OrderEntity order)
|
||||
|
||||
@ -1,5 +1,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 SJZY.Track.Domain.Queries;
|
||||
|
||||
namespace SJZY.Track.Application.Services.ProvideServices;
|
||||
@ -11,12 +13,15 @@ namespace SJZY.Track.Application.Services.ProvideServices;
|
||||
public class TrackQueryService : ApplicationService
|
||||
{
|
||||
private readonly ITrackDetailsRepository _trackDetailsRepository;
|
||||
private readonly IOrderRepository _orderRepository;
|
||||
private readonly IProvideQueries _provideQueries;
|
||||
|
||||
public TrackQueryService(ITrackDetailsRepository trackDetailsRepository,
|
||||
IOrderRepository orderRepository,
|
||||
IProvideQueries provideQueries)
|
||||
{
|
||||
_trackDetailsRepository = trackDetailsRepository;
|
||||
_orderRepository=orderRepository;
|
||||
_provideQueries = provideQueries;
|
||||
}
|
||||
|
||||
@ -63,6 +68,43 @@ public class TrackQueryService : ApplicationService
|
||||
return res;
|
||||
}
|
||||
|
||||
#region 轨迹订单明细列表
|
||||
/// <summary>
|
||||
/// 根据轨迹订单id获取轨迹订单明细列表
|
||||
/// </summary>
|
||||
/// <param name="input"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost("/Track/GetDetails")]
|
||||
public async Task<List<TrackOrderDetailDto>> GetOrderDetails(GetOrderDetailsInput input)
|
||||
{
|
||||
var trackDetails = await _trackDetailsRepository.GetListAsync(input.OrderId);
|
||||
if (!trackDetails.IsNullOrEmpty())
|
||||
{
|
||||
var list = ObjectMapper.Map<List<TrackDetailsIndex>, List<TrackOrderDetailDto>>(trackDetails);
|
||||
return list;
|
||||
}
|
||||
|
||||
return new List<TrackOrderDetailDto>();
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 轨迹订单分页
|
||||
/// <summary>
|
||||
/// 获取分页的轨迹订单
|
||||
/// </summary>
|
||||
/// <param name="input"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost("/Track/GetTrackOrderList")]
|
||||
public async Task<UnifyPageResultDto<TrackOrderDto>> GetPageTrackOrder(GetPageTrackOrderInput input)
|
||||
{
|
||||
var vo = ObjectMapper.Map<GetPageTrackOrderInput, GetPageTrackOrderInputVO>(input);
|
||||
var pageList = await _orderRepository.GetPageTrackOrder(vo);
|
||||
var pageResultDto =
|
||||
ObjectMapper.Map<UnifyPageResultDto<TrackOrderVO>, UnifyPageResultDto<TrackOrderDto>>(pageList);
|
||||
return pageResultDto;
|
||||
}
|
||||
#endregion
|
||||
|
||||
private async Task TrackDetailSort(List<GetTrackOutput> list, GetTrackInput input)
|
||||
{
|
||||
switch (input.SortMethod)
|
||||
|
||||
@ -1,7 +1,8 @@
|
||||
using SJZY.Track.Application.Contract.Dtos.ProvideServices;
|
||||
using DotNetCore.CAP;
|
||||
using SJZY.Track.Application.Contract.Dtos.ProvideServices;
|
||||
using SJZY.Track.Application.Contract.Events;
|
||||
using SJZY.Track.Application.EventHandlers;
|
||||
using SJZY.Track.Domain.Aggregates.OrderAggregate;
|
||||
using SJZY.Track.Domain.Queries;
|
||||
|
||||
namespace SJZY.Track.Application.Services.ProvideServices;
|
||||
|
||||
@ -12,12 +13,14 @@ namespace SJZY.Track.Application.Services.ProvideServices;
|
||||
public class TrackService : ApplicationService
|
||||
{
|
||||
private readonly IOrderRepository _orderRepository;
|
||||
private readonly TrackUpsertEventHandler _trackUpsertEventHandler;
|
||||
private readonly IProvideQueries _provideQueries;
|
||||
private readonly ICapPublisher _capPublisher;
|
||||
|
||||
public TrackService(IOrderRepository orderRepository, TrackUpsertEventHandler trackUpsertEventHandler)
|
||||
public TrackService(IOrderRepository orderRepository, IProvideQueries provideQueries, ICapPublisher capPublisher)
|
||||
{
|
||||
_orderRepository = orderRepository;
|
||||
_trackUpsertEventHandler = trackUpsertEventHandler;
|
||||
_provideQueries = provideQueries;
|
||||
_capPublisher = capPublisher;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -45,7 +48,45 @@ public class TrackService : ApplicationService
|
||||
@event.SubSystemId = order.SubSystemId;
|
||||
@event.IsPushCompleted = order.IsPushCompleted;
|
||||
@event.CustomId = order.CustomId;
|
||||
await _trackUpsertEventHandler.UpsertTrackAsync(@event);
|
||||
await _capPublisher.PublishAsync(GlobalConst.TrackUpsertSubscribe, @event);
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 删除轨迹
|
||||
/// </summary>
|
||||
/// <param name="input"></param>
|
||||
/// <returns></returns>
|
||||
/// <exception cref="BusinessException"></exception>
|
||||
[HttpPost("Track/Delete")]
|
||||
public async Task<bool> DeleteTrackAsync(DeleteTrackInput input)
|
||||
{
|
||||
var order = await _orderRepository.GetFirstAsync(x =>
|
||||
x.OrderType == input.OrderType && x.OrderNo == input.OrderNo, x => new
|
||||
{
|
||||
x.Id, x.SubSystemId, x.IsPushCompleted, x.CustomId
|
||||
});
|
||||
if (order == default)
|
||||
{
|
||||
throw new BusinessException(message: $"订单:{input.OrderNo}不存在");
|
||||
}
|
||||
|
||||
var codes = await _provideQueries.GetCanDeleteTrackCodesAsync(order.Id, input.TrackCodes);
|
||||
|
||||
if (codes.Count == 0)
|
||||
{
|
||||
throw new BusinessException(message: "没有一个轨迹代码是可删的");
|
||||
}
|
||||
|
||||
// 删除轨迹
|
||||
var @event = new TrackDeleteEvent
|
||||
{
|
||||
OrderId = order.Id,
|
||||
TrackCodes = codes,
|
||||
SubSystemId = order.SubSystemId,
|
||||
};
|
||||
await _capPublisher.PublishAsync(GlobalConst.TrackUpsertSubscribe, @event);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@ -101,7 +101,22 @@ namespace SJZY.Track.Application.Services.TrackContents
|
||||
if (trackContentEntitys.Any())
|
||||
{
|
||||
//throw new BusinessException(message: _stringLocalizer["TrackContentExist"]);
|
||||
throw new BusinessException(message: "当前子系统下,轨迹代码或轨迹内容或轨迹内容英文存在");
|
||||
var codes = trackContentEntitys.FirstOrDefault(a => a.Code==input.Code);
|
||||
if (codes!=null)
|
||||
{
|
||||
throw new BusinessException(message: "该子系统下轨迹代码已存在");
|
||||
}
|
||||
var contents = trackContentEntitys.FirstOrDefault(a => a.Content==input.Content);
|
||||
if (contents!=null)
|
||||
{
|
||||
throw new BusinessException(message: "该子系统下轨迹内容已存在");
|
||||
}
|
||||
var contentEns = trackContentEntitys.FirstOrDefault(a => a.EnContent==input.EnContent);
|
||||
if (contentEns!=null)
|
||||
{
|
||||
throw new BusinessException(message: "该子系统下轨迹内容英文已存在");
|
||||
}
|
||||
//throw new BusinessException(message: "当前子系统下,轨迹代码或轨迹内容或轨迹内容英文存在");
|
||||
}
|
||||
|
||||
#endregion 业务逻辑校验
|
||||
@ -122,7 +137,22 @@ namespace SJZY.Track.Application.Services.TrackContents
|
||||
if (trackContentEntitys.Any())
|
||||
{
|
||||
//throw new BusinessException(message: _stringLocalizer["TrackContentExist"]);
|
||||
throw new BusinessException(message: "当前子系统下,轨迹代码或轨迹内容或轨迹内容英文存在");
|
||||
//throw new BusinessException(message: "当前子系统下,轨迹代码或轨迹内容或轨迹内容英文存在");
|
||||
var codes = trackContentEntitys.FirstOrDefault(a => a.Code==input.Code);
|
||||
if (codes!=null)
|
||||
{
|
||||
throw new BusinessException(message: "该子系统下轨迹代码已存在");
|
||||
}
|
||||
var contents = trackContentEntitys.FirstOrDefault(a => a.Content==input.Content);
|
||||
if (contents!=null)
|
||||
{
|
||||
throw new BusinessException(message: "该子系统下轨迹内容已存在");
|
||||
}
|
||||
var contentEns = trackContentEntitys.FirstOrDefault(a => a.EnContent==input.EnContent);
|
||||
if (contentEns!=null)
|
||||
{
|
||||
throw new BusinessException(message: "该子系统下轨迹内容英文已存在");
|
||||
}
|
||||
}
|
||||
|
||||
#endregion 业务逻辑校验
|
||||
@ -163,21 +193,24 @@ namespace SJZY.Track.Application.Services.TrackContents
|
||||
private async Task<UnifyResultDto> DeleteAsync(EditTrackContentInput input)
|
||||
{
|
||||
#region 业务校验
|
||||
|
||||
//查询是否关联了轨迹模版内容
|
||||
var trackTemplateContents = await _trackTemplateContentBasicQuery.GetListAsync(a => a.TrackContentId == input.Id);
|
||||
if (trackTemplateContents.Any())
|
||||
var isExistTemplate = await _trackContentRepository.GetTemplateIsExist(input.Id);
|
||||
if (isExistTemplate)
|
||||
{
|
||||
throw new BusinessException(message: "该轨迹内容关联轨迹模板,禁止删除");
|
||||
}
|
||||
//var trackTemplateContents = await _trackTemplateContentBasicQuery.GetListAsync(a => a.TrackContentId == input.Id);
|
||||
//if (trackTemplateContents.Any())
|
||||
//{
|
||||
// throw new BusinessException(message: "该轨迹内容关联轨迹模板,禁止删除");
|
||||
//}
|
||||
|
||||
//需要加个判断,存在内容映射,则出提示
|
||||
var trackContentMapEntities = await _trackContentMapBasicQuery.GetListAsync(a => a.TrackContentId == input.Id || a.MapTrackContentId == input.Id);
|
||||
if (trackContentMapEntities.Any())
|
||||
{
|
||||
throw new BusinessException(message: "无法删除该内容,该轨迹内容已在轨迹内容映射中使用了,请检查");
|
||||
}
|
||||
|
||||
//var trackContentMapEntities = await _trackContentMapBasicQuery.GetListAsync(a => a.TrackContentId == input.Id || a.MapTrackContentId == input.Id);
|
||||
//if (trackContentMapEntities.Any())
|
||||
//{
|
||||
// throw new BusinessException(message: "无法删除该内容,该轨迹内容已在轨迹内容映射中使用了,请检查");
|
||||
//}
|
||||
#endregion 业务校验
|
||||
|
||||
var isTrue = await _trackContentRepository.SoftDeleteAsync(x => x.Id == input.Id);
|
||||
|
||||
@ -86,12 +86,22 @@ namespace SJZY.Track.Application.Services.TrackFlags
|
||||
private async Task<UnifyResultDto> AddAsync(EditTrackFlagInput input)
|
||||
{
|
||||
#region 业务校验
|
||||
var trackStatusEntitys = await _trackFlagRepository.GetListAsync(a =>
|
||||
var trackFlagsEntitys = await _trackFlagRepository.GetListAsync(a =>
|
||||
a.SubSystemId == input.SubSystemId && (a.Code == input.Code || a.Name == input.Flag));
|
||||
if (trackStatusEntitys.Any())
|
||||
if (trackFlagsEntitys.Any())
|
||||
{
|
||||
//throw new BusinessException(message: _stringLocalizer["TrackFlagExist"]);
|
||||
throw new BusinessException(message: "当前子系统下已存在轨迹标记代码");
|
||||
//throw new BusinessException(message: "当前子系统下已存在轨迹标记代码");
|
||||
var trackFlagCode = trackFlagsEntitys.FirstOrDefault(a => a.Code==input.Code);
|
||||
if (trackFlagCode!=null)
|
||||
{
|
||||
throw new BusinessException(message: "该子系统下代码已存在");
|
||||
}
|
||||
var trackFlagName = trackFlagsEntitys.FirstOrDefault(a => a.Name==input.Flag);
|
||||
if (trackFlagName!=null)
|
||||
{
|
||||
throw new BusinessException(message: "该子系统下标记已存在");
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
@ -105,13 +115,23 @@ namespace SJZY.Track.Application.Services.TrackFlags
|
||||
{
|
||||
#region 业务校验
|
||||
|
||||
var trackStatusEntitys = await _trackFlagRepository.GetListAsync(a => a.Id != input.Id &&
|
||||
var trackFlagsEntitys = await _trackFlagRepository.GetListAsync(a => a.Id != input.Id &&
|
||||
a.SubSystemId == input.SubSystemId && (a.Code == input.Code ||
|
||||
a.Name == input.Flag));
|
||||
if (trackStatusEntitys.Any())
|
||||
if (trackFlagsEntitys.Any())
|
||||
{
|
||||
//throw new BusinessException(message: _stringLocalizer["TrackFlagExist"]);
|
||||
throw new BusinessException(message: "当前子系统下已存在轨迹标记代码");
|
||||
//throw new BusinessException(message: "当前子系统下已存在轨迹标记代码");
|
||||
var trackFlagCode = trackFlagsEntitys.FirstOrDefault(a => a.Code==input.Code);
|
||||
if (trackFlagCode!=null)
|
||||
{
|
||||
throw new BusinessException(message: "该子系统下代码已存在");
|
||||
}
|
||||
var trackFlagName = trackFlagsEntitys.FirstOrDefault(a => a.Name==input.Flag);
|
||||
if (trackFlagName!=null)
|
||||
{
|
||||
throw new BusinessException(message: "该子系统下标记已存在");
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@ -169,7 +169,7 @@ public class TrackPullService : ApplicationService, ITransientDependency
|
||||
await _trackPullConfigRepository.UpdateAsync(oldTrackPullEntity);
|
||||
await _trackPullConfigRepository.UpdateParamsAsync(oldTrackPullParamsEntity);
|
||||
|
||||
if (oldTrackPullEntity.TrackTemplateId != input.TrackTemplateId)
|
||||
if (trackPullContentEntities.Count > 0)
|
||||
{
|
||||
await _trackPullConfigRepository.SoftDeleteContentAsync(x => x.TrackPullConfigId == input.Id);
|
||||
await _trackPullConfigRepository.InsertContentRangeAsync(trackPullContentEntities);
|
||||
|
||||
@ -93,7 +93,22 @@ public class TrackStatusService : ApplicationService, ITransientDependency
|
||||
if (trackStatusEntitys.Any())
|
||||
{
|
||||
//throw new BusinessException(message: _stringLocalizer["TrackStatusExist"]);
|
||||
throw new BusinessException(message: "当前子系统下,轨迹状态代码或轨迹状态或轨迹状态英文存在");
|
||||
//throw new BusinessException(message: "当前子系统下,轨迹状态代码或轨迹状态或轨迹状态英文存在");
|
||||
var trackStatusCode = trackStatusEntitys.FirstOrDefault(t => t.Code==input.Code);
|
||||
if (trackStatusCode!=null)
|
||||
{
|
||||
throw new BusinessException(message: "该子系统下轨迹状态代码已存在");
|
||||
}
|
||||
var trackStatusName = trackStatusEntitys.FirstOrDefault(t => t.Status==input.TrackStatus);
|
||||
if (trackStatusName!=null)
|
||||
{
|
||||
throw new BusinessException(message: "该子系统下轨迹状态已存在");
|
||||
}
|
||||
var trackStatusEnName = trackStatusEntitys.FirstOrDefault(t => t.EnStatus==input.EntrackStatus);
|
||||
if (trackStatusEnName!=null)
|
||||
{
|
||||
throw new BusinessException(message: "该子系统下轨迹状态英文已存在");
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
@ -114,7 +129,22 @@ public class TrackStatusService : ApplicationService, ITransientDependency
|
||||
if (trackStatusEntitys.Any())
|
||||
{
|
||||
//throw new BusinessException(message: _stringLocalizer["TrackStatusExist"]);
|
||||
throw new BusinessException(message: "当前子系统下,轨迹状态代码或轨迹状态或轨迹状态英文存在");
|
||||
//throw new BusinessException(message: "当前子系统下,轨迹状态代码或轨迹状态或轨迹状态英文存在");
|
||||
var trackStatusCode = trackStatusEntitys.FirstOrDefault(t => t.Code==input.Code);
|
||||
if (trackStatusCode!=null)
|
||||
{
|
||||
throw new BusinessException(message: "该子系统下轨迹状态代码已存在");
|
||||
}
|
||||
var trackStatusName = trackStatusEntitys.FirstOrDefault(t => t.Status==input.TrackStatus);
|
||||
if (trackStatusName!=null)
|
||||
{
|
||||
throw new BusinessException(message: "该子系统下轨迹状态已存在");
|
||||
}
|
||||
var trackStatusEnName = trackStatusEntitys.FirstOrDefault(t => t.EnStatus==input.EntrackStatus);
|
||||
if (trackStatusEnName!=null)
|
||||
{
|
||||
throw new BusinessException(message: "该子系统下轨迹状态英文已存在");
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
@ -133,7 +163,7 @@ public class TrackStatusService : ApplicationService, ITransientDependency
|
||||
if (isExistStatus!=null)
|
||||
{
|
||||
//throw new BusinessException(message: _stringLocalizer["IsExistTrackStatus"]);
|
||||
throw new BusinessException(message: "轨迹内容已经绑定了该轨迹状态,请先删除轨迹内容后再删除该轨迹状态");
|
||||
throw new BusinessException(message: "该状态关联轨迹内容,禁止删除");
|
||||
}
|
||||
#endregion
|
||||
var isTrue = await _trackStatusRepository.SoftDeleteAsync(x => x.Id == input.Id);
|
||||
|
||||
@ -96,13 +96,24 @@ public class TrackTemplateService : ApplicationService, ITransientDependency
|
||||
#region 业务校验
|
||||
|
||||
//校验模版代码唯一性
|
||||
var templateEntity =
|
||||
await _trackTemplateRepository.GetFirstAsync(
|
||||
a => a.SubSystemId == input.SubSystemId && a.Code == input.Code);
|
||||
if (templateEntity != null)
|
||||
//var templateEntity =
|
||||
// await _trackTemplateRepository.GetFirstAsync(
|
||||
// a => a.SubSystemId == input.SubSystemId && a.Code == input.Code);
|
||||
var templateEntitys = await _trackTemplateRepository.GetListAsync(a => a.SubSystemId == input.SubSystemId && (a.Code == input.Code|| a.Name==input.Name));
|
||||
if (templateEntitys.Any())
|
||||
{
|
||||
//throw new BusinessException(message: _stringLocalizer["TemplateExist"]);
|
||||
throw new BusinessException(message: "模板代码已存在于当前选择的子系统下");
|
||||
//throw new BusinessException(message: "模板代码已存在于当前选择的子系统下");
|
||||
var trackTemplateCode = templateEntitys.FirstOrDefault(t => t.Code==input.Code);
|
||||
if (trackTemplateCode!=null)
|
||||
{
|
||||
throw new BusinessException(message: "该子系统下模板代码已存在");
|
||||
}
|
||||
var trackTemplateName = templateEntitys.FirstOrDefault(t => t.Name==input.Name);
|
||||
if (trackTemplateName!=null)
|
||||
{
|
||||
throw new BusinessException(message: "该子系统下模板名称已存在");
|
||||
}
|
||||
}
|
||||
|
||||
#endregion 业务校验
|
||||
@ -117,11 +128,21 @@ public class TrackTemplateService : ApplicationService, ITransientDependency
|
||||
{
|
||||
#region 业务校验
|
||||
|
||||
var isExist = await _trackTemplateRepository.GetFirstAsync(a =>
|
||||
a.Id != input.Id && a.SubSystemId == input.SubSystemId && a.Code == input.Code);
|
||||
if (isExist != null)
|
||||
var templateEntitys = await _trackTemplateRepository.GetListAsync(a =>
|
||||
a.Id != input.Id && a.SubSystemId == input.SubSystemId && (a.Code == input.Code || a.Name==input.Name));
|
||||
if (templateEntitys.Any())
|
||||
{
|
||||
throw new BusinessException(message: "模板代码已存在于当前选择的子系统下");
|
||||
//throw new BusinessException(message: "模板代码已存在于当前选择的子系统下");
|
||||
var trackTemplateCode = templateEntitys.FirstOrDefault(t => t.Code==input.Code);
|
||||
if (trackTemplateCode!=null)
|
||||
{
|
||||
throw new BusinessException(message: "该子系统下模板代码已存在");
|
||||
}
|
||||
var trackTemplateName = templateEntitys.FirstOrDefault(t => t.Name==input.Name);
|
||||
if (trackTemplateName!=null)
|
||||
{
|
||||
throw new BusinessException(message: "该子系统下模板名称已存在");
|
||||
}
|
||||
}
|
||||
|
||||
#endregion 业务校验
|
||||
@ -142,13 +163,13 @@ public class TrackTemplateService : ApplicationService, ITransientDependency
|
||||
if (isExisistTrackPullConfigs.Any())
|
||||
{
|
||||
//throw new BusinessException(message: _stringLocalizer["IsExistTrackPullConfig"]);
|
||||
throw new BusinessException(message: "轨迹拉取配置里已经绑定模版,请检查");
|
||||
throw new BusinessException(message: "该模板存在映射,禁止删除");
|
||||
}
|
||||
//轨迹推送里看看是否被占用
|
||||
var isExisistTrackPushConfigs = await _trackPushConfigRepository.GetListAsync(a => a.TrackTemplateId.Contains(input.Id.ToString()));
|
||||
if (isExisistTrackPushConfigs.Any())
|
||||
{
|
||||
throw new BusinessException(message: "轨迹推送配置里已经绑定模版,请检查");
|
||||
throw new BusinessException(message: "该模板存在映射,禁止删除");
|
||||
}
|
||||
|
||||
#endregion 业务校验
|
||||
|
||||
@ -12,7 +12,7 @@ public class EditTrackContentMapInputValidation : AbstractValidator<EditTrackCon
|
||||
{
|
||||
RuleFor(x => x.Options).IsInEnum().WithMessage(stringLocalizer[SjzyBasicLocalization.Validation_IsInEnum, nameof(EditTrackContentMapInput.Options)]);
|
||||
|
||||
//RuleFor(x => x.Id).GreaterThan(0).WithMessage(stringLocalizer[SjzyBasicLocalization.Validation_GreaterThan, nameof(EditTrackContentMapInput.Id), 0]);
|
||||
RuleFor(x => x.Id).GreaterThan(0).WithMessage(stringLocalizer[SjzyBasicLocalization.Validation_GreaterThan, nameof(EditTrackContentMapInput.Id), 0]);
|
||||
|
||||
RuleFor(x => x.MapSubSystemId).GreaterThan(0).WithMessage(stringLocalizer[SjzyBasicLocalization.Validation_GreaterThan, nameof(EditTrackContentMapInput.MapSubSystemId), 0]);
|
||||
|
||||
@ -22,10 +22,10 @@ public class EditTrackContentMapInputValidation : AbstractValidator<EditTrackCon
|
||||
|
||||
RuleFor(x => x.TrackContentId).GreaterThan(0).WithMessage(stringLocalizer[SjzyBasicLocalization.Validation_GreaterThan, nameof(EditTrackContentMapInput.TrackContentId), 0]);
|
||||
|
||||
//When(x => x.Options != OptionTypeNoNull.新增, () =>
|
||||
//{
|
||||
// RuleFor(x => x.Id).NotNull().WithMessage(stringLocalizer[SjzyBasicLocalization.Validation_NotNull, nameof(EditTrackContentMapInput.Id)]);
|
||||
//});
|
||||
When(x => x.Options != OptionTypeNoNull.新增, () =>
|
||||
{
|
||||
RuleFor(x => x.Id).NotNull().WithMessage(stringLocalizer[SjzyBasicLocalization.Validation_NotNull, nameof(EditTrackContentMapInput.Id)]);
|
||||
});
|
||||
|
||||
When(x => x.Options != OptionTypeNoNull.删除, () =>
|
||||
{
|
||||
|
||||
@ -16,7 +16,8 @@ public class EditTrackPullConfigInputValidation : AbstractValidator<EditTrackPul
|
||||
|
||||
RuleFor(x => x.ParseMethod).GreaterThan(0).WithMessage(stringLocalizer[SjzyBasicLocalization.Validation_GreaterThan, nameof(EditTrackPullConfigInput.ParseMethod), 0]);
|
||||
|
||||
RuleFor(x => x.PullInterval).GreaterThan(0).WithMessage(stringLocalizer[SjzyBasicLocalization.Validation_GreaterThan, nameof(EditTrackPullConfigInput.PullInterval), 0]);
|
||||
RuleFor(x => x.PullInterval)
|
||||
.GreaterThanOrEqualTo(30).WithMessage(stringLocalizer[SjzyBasicLocalization.Validation_GreaterThanOrEqualTo, nameof(EditTrackPullConfigInput.PullInterval), 30]);
|
||||
|
||||
RuleFor(x => x.SubSystemId).GreaterThan(0).WithMessage(stringLocalizer[SjzyBasicLocalization.Validation_GreaterThan, nameof(EditTrackPullConfigInput.SubSystemId), 0]);
|
||||
|
||||
|
||||
@ -23,4 +23,5 @@ public interface ITrackContentRepository : IBasicRepository<TrackContentEntity>
|
||||
Task<bool> SoftDeleteMapAsync(Expression<Func<TrackContentMapEntity, bool>> whereExpression);
|
||||
|
||||
Task<bool> UpdateMapAsync(Expression<Func<TrackContentMapEntity, TrackContentMapEntity>> columns, Expression<Func<TrackContentMapEntity, bool>> whereExpression);
|
||||
Task<bool> GetTemplateIsExist(int trackContentId);
|
||||
}
|
||||
@ -4,7 +4,7 @@ namespace SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
|
||||
|
||||
public interface ITrackDetailsRepository
|
||||
{
|
||||
Task<TrackDetailsIndex?> GetFirstOrDefaultAsync(int orderId, string inputTrackCode);
|
||||
Task<TrackDetailsIndex?> GetFirstOrDefaultAsync(int orderId, string trackCode);
|
||||
|
||||
Task UpsertAsync(TrackDetailsIndex index);
|
||||
|
||||
@ -12,4 +12,12 @@ public interface ITrackDetailsRepository
|
||||
|
||||
Task<(List<TrackDetailsIndex> list, long total)> GetListAsync(TrackDetailsQueryInput input);
|
||||
Task<List<TrackDetailsIndex>> GetListAsync(int orderId);
|
||||
|
||||
/// <summary>
|
||||
/// 删除轨迹
|
||||
/// </summary>
|
||||
/// <param name="orderId"></param>
|
||||
/// <param name="trackCodes"></param>
|
||||
/// <returns></returns>
|
||||
Task DeleteTrackAsync(int orderId, List<string> trackCodes);
|
||||
}
|
||||
@ -0,0 +1,14 @@
|
||||
namespace SJZY.Track.Domain.Dtos.TrackDetails;
|
||||
|
||||
public class MatchTrackContentsDto
|
||||
{
|
||||
/// <summary>
|
||||
/// 轨迹代码
|
||||
/// </summary>
|
||||
public string TrackCode { get; set; } = null!;
|
||||
|
||||
/// <summary>
|
||||
/// 是否支持删除
|
||||
/// </summary>
|
||||
public bool IsCanDelete { get; set; }
|
||||
}
|
||||
@ -56,6 +56,11 @@ public class GetTrackTemplateListVO
|
||||
/// </summary>
|
||||
public string SubSystem { set; get; }
|
||||
|
||||
/// <summary>
|
||||
/// 子系统id
|
||||
/// </summary>
|
||||
public int SubSystemId { set; get; }
|
||||
|
||||
/// <summary>
|
||||
/// 创建时间
|
||||
/// </summary>
|
||||
|
||||
@ -12,6 +12,11 @@ public class GlobalConst
|
||||
/// </summary>
|
||||
public const string TrackUpsertSubscribe = "SJZY.Track.TrackUpsert";
|
||||
|
||||
/// <summary>
|
||||
/// 轨迹删除 mq订阅名称
|
||||
/// </summary>
|
||||
public const string TrackDeleteSubscribe = "SJZY.Track.TrackDelete";
|
||||
|
||||
/// <summary>
|
||||
/// 接口通批量轨迹刷新订阅
|
||||
/// </summary>
|
||||
|
||||
@ -33,14 +33,22 @@ public interface IProvideQueries
|
||||
/// <returns></returns>
|
||||
Task<MatchTrackContentDto?> MatchTrackContentAsync(int orderId, string code);
|
||||
|
||||
/// <summary>
|
||||
/// 获取可删除的订单轨迹代码
|
||||
/// </summary>
|
||||
/// <param name="orderId"></param>
|
||||
/// <param name="trackCodes"></param>
|
||||
/// <returns></returns>
|
||||
Task<List<string>> GetCanDeleteTrackCodesAsync(int orderId, List<string> trackCodes);
|
||||
|
||||
/// <summary>
|
||||
/// 根据子系统内容映射,得到映射后的轨迹code
|
||||
/// </summary>
|
||||
/// <param name="upSubSystemId"></param>
|
||||
/// <param name="subSystemId"></param>
|
||||
/// <param name="trackCode"></param>
|
||||
/// <param name="trackCodes"></param>
|
||||
/// <returns></returns>
|
||||
Task<string?> MapTrackContentCodeAsync(int upSubSystemId, int subSystemId, string trackCode);
|
||||
Task<List<string>> MapTrackCodesAsync(int upSubSystemId, int subSystemId, params string[] trackCodes);
|
||||
|
||||
/// <summary>
|
||||
/// 获取服务商模板配置
|
||||
|
||||
@ -80,13 +80,24 @@ public class ProvideQueries : ISugarRepository, IProvideQueries,
|
||||
.FirstAsync();
|
||||
}
|
||||
|
||||
public async Task<string?> MapTrackContentCodeAsync(int upSubSystemId, int subSystemId, string trackCode)
|
||||
public async Task<List<string>> GetCanDeleteTrackCodesAsync(int orderId, List<string> trackCodes)
|
||||
{
|
||||
return await Context.Queryable<OrderTemplateEntity>()
|
||||
.LeftJoin<TrackTemplateContentEntity>((x, a) => x.TrackTemplateId == a.TrackTemplateId && a.IsCanDelete)
|
||||
.LeftJoin<TrackContentEntity>((x, a, b) => a.TrackContentId == b.Id)
|
||||
.Where((x, a, b) => x.OrderId == orderId
|
||||
&& trackCodes.Contains(b.Code))
|
||||
.Select((x, a, b) => b.Code)
|
||||
.ToListAsync();
|
||||
}
|
||||
|
||||
public async Task<List<string>> MapTrackCodesAsync(int upSubSystemId, int subSystemId, params string[] trackCodes)
|
||||
{
|
||||
return await Context.Queryable<TrackContentMapEntity>()
|
||||
.Where(x => x.SubSystemId == upSubSystemId && x.MapSubSystemId == subSystemId &&
|
||||
x.TrackContentCode == trackCode)
|
||||
trackCodes.Contains(x.TrackContentCode))
|
||||
.Select(x => x.MapTrackContentCode)
|
||||
.FirstAsync();
|
||||
.ToListAsync();
|
||||
}
|
||||
|
||||
public async Task<List<TrackPullContentConfigVO>> GetPullContentConfigsAsync(int serviceProviderId)
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
using SJZY.Track.Domain.Aggregates.TrackContentAggregate;
|
||||
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.VEntities;
|
||||
using System.Linq;
|
||||
@ -88,6 +89,32 @@ public class TrackContentRepository : BasicRepository<TrackContentEntity>, ITrac
|
||||
return pagedList;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取轨迹模版是否存在
|
||||
/// </summary>
|
||||
/// <param name="trackContentId"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<bool> GetTemplateIsExist(int trackContentId)
|
||||
{
|
||||
//var trackTemplateContents = await _trackTemplateContentBasicQuery.GetListAsync(a => a.TrackContentId == input.Id);
|
||||
var trackContentEntities = await Context.Queryable<TrackContentEntity>().LeftJoin<TrackTemplateContentEntity>((a, b) => a.Id==b.TrackContentId && b.IsDeleted==false)
|
||||
.LeftJoin<TrackTemplateEntity>((a, b, c) => b.TrackTemplateId==c.Id&& c.IsDeleted==false)
|
||||
.Where((a, b, c) => a.Id==trackContentId)
|
||||
.Select((a, b, c) => new
|
||||
{
|
||||
TrackContentId = a.Id,
|
||||
TemplateId = c.Id
|
||||
})
|
||||
.ToListAsync();
|
||||
|
||||
if (trackContentEntities.Any(a => a.TemplateId>0))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public async Task<UnifyPageResultDto<GetTrackContentMapPageOutputVO>> GetMapPageAsync(GetTrackContentMapPageInputVO input)
|
||||
{
|
||||
return await Context.Queryable<TrackContentMapEntity>()
|
||||
|
||||
@ -22,6 +22,7 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract<TrackDetail
|
||||
.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))
|
||||
)
|
||||
);
|
||||
|
||||
@ -62,7 +63,9 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract<TrackDetail
|
||||
q.Terms(t => t
|
||||
.Field(f => f.OrderNo)
|
||||
.Terms(orderNos))
|
||||
&& q.Term(f => f.OrderType, orderType))
|
||||
&& q.Term(f => f.OrderType, orderType)
|
||||
&& q.Term(t => t.Field(f => f.IsDeleted).Value(true))
|
||||
)
|
||||
);
|
||||
|
||||
return data.Documents.ToList();
|
||||
@ -78,11 +81,27 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract<TrackDetail
|
||||
.Field(f => f.TrackPlace)
|
||||
.Field(f => f.TrackTime)
|
||||
.Field(f => f.TraceTimeZone)
|
||||
)).Query(q => q.Terms(t => t.Field(f => f.OrderId).Terms(orderId))));
|
||||
)).Query(q =>
|
||||
q.Terms(t => t.Field(f => f.OrderId).Terms(orderId))
|
||||
&& q.Term(t => t.Field(f => f.IsDeleted).Value(true))
|
||||
)
|
||||
);
|
||||
|
||||
return data?.Documents?.ToList();
|
||||
}
|
||||
|
||||
public async Task DeleteTrackAsync(int orderId, List<string> trackCodes)
|
||||
{
|
||||
await Context.UpdateByQueryAsync<TrackDetailsIndex>(x => x
|
||||
.Query(
|
||||
q =>
|
||||
q.Term(t => t.OrderId, orderId)
|
||||
&& q.Terms(t => t.Field(f => f.TrackCode).Terms(trackCodes)))
|
||||
.Script(s => s
|
||||
.Source("ctx._source.IsDeleted = true"))
|
||||
);
|
||||
}
|
||||
|
||||
public async Task<(List<TrackDetailsIndex> list, long total)> GetListAsync(TrackDetailsQueryInput input)
|
||||
{
|
||||
if (input.OrderNos.Count < 1) return default;
|
||||
@ -91,9 +110,12 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract<TrackDetail
|
||||
var finalSize = input.PageSize > 500 ? 500 : input.PageSize;
|
||||
|
||||
var data = await Context.SearchAsync<TrackDetailsIndex>(x => x
|
||||
.Query(q => q.Terms(t => t
|
||||
.Query(q =>
|
||||
q.Terms(t => t
|
||||
.Field(f => f.OrderNo)
|
||||
.Terms(distinctOrderNumbers)))
|
||||
.Terms(distinctOrderNumbers))
|
||||
&& q.Term(t => t.Field(f => f.IsDeleted).Value(true))
|
||||
)
|
||||
.Sort(s => s.Field(f => f.CreateTime, SortOrder.Descending))
|
||||
.From((input.PageIndex - 1) * input.PageSize)
|
||||
.Size(finalSize)
|
||||
|
||||
@ -55,7 +55,8 @@ public class TrackTemplateRepository : BasicRepository<TrackTemplateEntity>, ITr
|
||||
Code = a.Code,
|
||||
CreateTime = a.CreateTime,
|
||||
Name = a.Name,
|
||||
SubSystem = b.CnName
|
||||
SubSystem = b.CnName,
|
||||
SubSystemId = b.Id
|
||||
})
|
||||
.ToPagedListAsync(input.PageIndex, input.PageSize);
|
||||
//.OrderByIF(input.TrackTemplateId > 0,
|
||||
|
||||
Loading…
Reference in New Issue
Block a user