using SJZY.Expand.ABP.Core.PublicMethords;
using SJZY.Track.Application.Caching;
using SJZY.Track.Application.Contract.Dtos.Warning;
using SJZY.Track.Application.Contract.Dtos.Warning.Complete;
using SJZY.Track.Application.Contract.Dtos.Warning.Return;
using SJZY.Track.Application.Helpers;
using SJZY.Track.Application.Services.Warning.Handlers;
using SJZY.Track.Application.Services.Warning.Model;
using SJZY.Track.Domain.Aggregates.OrderAggregate;
using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
using SJZY.Track.Domain.Aggregates.WarningAggregate;
using SJZY.Track.Domain.Aggregates.WarningAggregate.Complete;
using SJZY.Track.Domain.Dtos.Warning;
using SJZY.Track.Domain.Enums;
using SJZY.Track.Domain.Extensions;
namespace SJZY.Track.Application.Services.Warning;
///
/// 完整预警服务
///
[ApiExplorerSettings(GroupName = "预警服务")]
[Route("Warning/Complete")]
public class CompleteWarningService : ApplicationService
{
private readonly IOrderRepository _orderRepository;
private readonly IWarningRuleRepository _warningRuleRepository;
private readonly IWarningDetailsEsRepository _warningDetailsEsRepository;
private readonly ITrackDetailsEsRepository _trackDetailsEsRepository;
private readonly ICompleteWarningHandler _completeWarningHandler;
private readonly TrackStatusNameDictCache _trackStatusNameDictCache;
private readonly CustomAbbreviationDictCache _customAbbreviationDictCache;
private readonly SystemCnNameDictCache _systemCnNameDictCache;
public CompleteWarningService(
IOrderRepository orderRepository,
IWarningRuleRepository warningRuleRepository,
IWarningDetailsEsRepository warningDetailsEsRepository,
ITrackDetailsEsRepository trackDetailsEsRepository,
ICompleteWarningHandler completeWarningHandler,
TrackStatusNameDictCache trackStatusNameDictCache,
CustomAbbreviationDictCache customAbbreviationDictCache,
SystemCnNameDictCache systemCnNameDictCache
)
{
_orderRepository = orderRepository;
_warningRuleRepository = warningRuleRepository;
_warningDetailsEsRepository = warningDetailsEsRepository;
_trackDetailsEsRepository = trackDetailsEsRepository;
_completeWarningHandler = completeWarningHandler;
_trackStatusNameDictCache = trackStatusNameDictCache;
_customAbbreviationDictCache = customAbbreviationDictCache;
_systemCnNameDictCache = systemCnNameDictCache;
}
///
/// 获取完整预警规则列表
///
///
///
[HttpPost("GetCompleteWarningRuleItem")]
public async Task>> GetCompleteWarningRuleItem(GetCompleteWarningRuleItemInput input)
{
var result = await _warningRuleRepository.GetCompleteRuleItemsAsync(input.WarningId);
if (result.Count == 0)
return new UnifyResultDto>(true, new List());
var trackStatusIds = result
.SelectMany(x =>
{
// todo:逻辑优化
var checkStatusId = x.CheckPointTrackStatusId;
var requireStatusIds = x.GetRequireTrackStatusIdGroups();
requireStatusIds.Add(new HashSet(1)
{
checkStatusId
});
return requireStatusIds.SelectMany(y => y);
}).ToHashSet();
// 查轨迹状态名称字典
var trackStatusDict = await _trackStatusNameDictCache.SafeGetBatchAsync(trackStatusIds);
// 查订单类型字典
var orderTypeDict = await _orderRepository.GetTrackOrderTypeDictAsync();
var map = result.Select(x => new CompleteWarningRuleItemDto
{
Id = x.Id,
WarningId = x.WarningId,
OrderTypes = BuildOrderTypes(x),
CheckPointTrackStatusId = x.CheckPointTrackStatusId,
CheckPointTrackStatus = trackStatusDict.GetValueOrDefault(x.CheckPointTrackStatusId, GlobalConst.EmptyString),
RequireTrackStatus = BuildRequireTrackStatus(x),
NotifyUsers = TextJsonHelper.Deserialize>(x.NotifyUsers)!
});
return new UnifyResultDto>(true, map.ToList());
List BuildRequireTrackStatus(CompleteWarningRuleItemEntity entity)
{
return entity.GetRequireTrackStatusIdGroups()
.Select(g => new RequireTrackStatusItem
{
Statuses = g.Select(id => new TrackStatusDto
{
TrackStatusId = id,
TrackStatus = trackStatusDict.GetValueOrDefault(id, GlobalConst.EmptyString)
}).ToList()
}).ToList();
}
List BuildOrderTypes(CompleteWarningRuleItemEntity entity)
{
return entity.GetRuleOrderTypes()
.Select(x => new OrderTypeDto
{
OrderType = x,
OrderTypeName = orderTypeDict.GetValueOrDefault(x.ToString(), GlobalConst.EmptyString)
}).ToList();
}
}
///
/// 分页获取完整预警详情
///
///
///
[HttpPost("GetPageCompleteWarningDetails")]
public async Task> GetPageCompleteWarningDetails(GetPageCompleteWarningDetailsInput input)
{
var vo = ObjectMapper.Map(input);
var result = await _warningDetailsEsRepository.GetPageCompleteWarningDetailsAsync(vo);
if (result.List.Count == 0)
{
return new UnifyPageResultDto(new List(),
result.Pagination.PageIndex,
result.Pagination.PageSize,
result.Pagination.Total);
}
// 订单类型名称字典
var orderTypeDict = await _orderRepository.GetTrackOrderTypeDictAsync();
var trackStatusIds = result.List
.SelectMany(x => x.GetMissingTrackStatusIdGroups().SelectMany(y => y))
.ToHashSet();
// 轨迹状态名称字典
var trackStatusDict = await _trackStatusNameDictCache.SafeGetBatchAsync(trackStatusIds);
// 客户id简称字典
var customIds = result.List.Select(x => x.CustomId).ToHashSet();
var customDict = await _customAbbreviationDictCache.SafeGetBatchAsync(customIds);
// 子系统id中文名字典
var subSystemIds = result.List.Select(x => x.SubSystemId).ToHashSet();
var subSystemDict = await _systemCnNameDictCache.SafeGetBatchAsync(subSystemIds);
// 查最新轨迹(创建时间)
var orderIds = result.List.Select(x => x.OrderId).ToHashSet();
var orderIdTrackDict = await _trackDetailsEsRepository.GetLatestDictAsync(orderIds);
var map = result.List.Select(x =>
{
var orderIdTrack = orderIdTrackDict.GetValueOrDefault(x.OrderId);
return new CompleteWarningDetailsDto
{
EsId = x.Id,
SubSystemId = x.SubSystemId,
SubSystemName = subSystemDict.GetValueOrDefault(x.SubSystemId, GlobalConst.EmptyString),
OrderType = x.OrderType,
OrderTypeName = orderTypeDict.GetValueOrDefault(x.OrderType.ToString(), GlobalConst.EmptyString),
OrderId = x.OrderId,
OrderNo = x.OrderNo,
Status = x.Status,
CustomId = x.CustomId,
CustomName = customDict.GetValueOrDefault(x.CustomId, GlobalConst.EmptyString),
MissingTrackStatus = BuildMissingTrackStatus(x),
LatestTrackStatus = orderIdTrack?.TrackStatus,
LatestTrackContent = orderIdTrack?.TrackContent,
LatestTrackPlace = orderIdTrack?.TrackPlace,
LatestTrackTime = orderIdTrack?.TrackTime,
LatestTrackTimeZone = DateTimeHelper.ConvertFloatToTimeZone(orderIdTrack?.TrackTimeZone),
NotifyUserNames = ToUserNames(x.NotifyUsers),
CreateTime = x.CreateTime,
ProcessedTime = x.ProcessedTime
};
});
// 按状态组+组内时间降序,分割状态组 g1:(待处理) g2:(已处理/已关闭) 确保g1总是在g2之前
var sorted = map
.OrderBy(x => x.Status == (int) CompleteWarningStatus.待处理 ? 1 : 2)
.ThenByDescending(x => x.CreateTime); //同状态组按时间降序;
return new UnifyPageResultDto(
sorted.ToList(),
result.Pagination.PageIndex,
result.Pagination.PageSize,
result.Pagination.Total);
// 通知用户提取用户名称
string ToUserNames(string notifyUsers)
{
if (string.IsNullOrWhiteSpace(notifyUsers))
return string.Empty;
return string.Join(',', notifyUsers.ToObject>().Select(x => x.UserName));
}
// 构建缺失轨迹状态
List BuildMissingTrackStatus(CompleteWarningDetailsIndex detail)
{
return detail.GetMissingTrackStatusIdGroups()
.Select(g => new RequireTrackStatusItem
{
Statuses = g.Select(id => new TrackStatusDto
{
TrackStatusId = id,
TrackStatus = trackStatusDict.GetValueOrDefault(id, GlobalConst.EmptyString)
}).ToList()
}).ToList();
}
}
///
/// 编辑完整预警规则列表
///
///
///
[HttpPost("EditCompleteWarningRuleItem")]
public async Task EditCompleteWarningRuleItem(EditCompleteWarningRuleItemInput input)
{
var rule = await _warningRuleRepository.GetWarningRuleByIdAsync(input.WarningId, WarningRuleType.完整预警);
if (rule == null)
{
throw new BusinessException(message: $"预警规则主体不存在,WarningId=[{input.WarningId}]");
}
var bos = CompleteWarningRuleItemBO.From(input);
// 同一个主体下同一个检查点,订单类型不允许出现交集
foreach (var group in bos.GroupBy(x => x.CheckPointTrackStatusId))
{
var allOrderTypes = new HashSet();
var count = 0;
foreach (var orderTypes in group.Select(x => x.OrderTypes))
{
allOrderTypes.UnionWith(orderTypes);
count += orderTypes.Count;
}
if (allOrderTypes.Count < count)
{
throw new BusinessException(message: "同一个检查点下,订单类型不允许出现交集!");
}
}
await _completeWarningHandler.HandleEditAsync(rule, bos);
return new UnifyResultDto(true);
}
}