This commit is contained in:
dingenwen 2024-03-04 18:31:24 +08:00
commit 23bdae7520
26 changed files with 472 additions and 78 deletions

View File

@ -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",

View File

@ -3,3 +3,11 @@
public class DeleteOrderInput : OrderNoInfo
{
}
public class DeleteTrackInput : OrderNoInfo
{
/// <summary>
/// 轨迹code
/// </summary>
public List<string> TrackCodes { get; set; } = new();
}

View File

@ -56,6 +56,11 @@
/// </summary>
public string SubSystem { set; get; }
/// <summary>
/// 子系统id
/// </summary>
public int SubSystemId { set; get; }
/// <summary>
/// 创建时间
/// </summary>

View File

@ -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; }
}

View File

@ -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);
}
}
}

View File

@ -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

View File

@ -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)

View File

@ -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)

View File

@ -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;
}
}

View File

@ -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);

View File

@ -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

View File

@ -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);

View File

@ -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);

View File

@ -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 业务校验

View File

@ -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.删除, () =>
{

View File

@ -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]);

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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; }
}

View File

@ -56,6 +56,11 @@ public class GetTrackTemplateListVO
/// </summary>
public string SubSystem { set; get; }
/// <summary>
/// 子系统id
/// </summary>
public int SubSystemId { set; get; }
/// <summary>
/// 创建时间
/// </summary>

View File

@ -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>

View File

@ -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>
/// 获取服务商模板配置

View File

@ -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)

View File

@ -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>()

View File

@ -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)

View File

@ -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,