using Nest; using SJZY.Expand.ElasticSearch.Services; using SJZY.Track.Domain.Aggregates.WarningAggregate; using SJZY.Track.Domain.Aggregates.WarningAggregate.Complete; using SJZY.Track.Domain.Aggregates.WarningAggregate.Return; using SJZY.Track.Domain.Aggregates.WarningAggregate.Transport; using SJZY.Track.Domain.Consts; using SJZY.Track.Domain.Dtos.Warning; using SJZY.Track.Domain.Enums; using SJZY.Track.Domain.Extensions; namespace SJZY.Track.Repository.Repositories; public class WarningDetailsEsRepository : IWarningDetailsEsRepository, ITransientDependency { private readonly IElasticClient _client; public WarningDetailsEsRepository(ConnectionFactory connection) { _client = connection.GetContext(typeof(TransportWarningDetailsIndex)); } #region 运输时效 public async Task> GetPageTransportWarningDetailsAsync(GetPageTransportWarningDetailsInputVO input) { var musts = ListWrapperFactory.CreateListWrapper(input); var orderNos = input.OrderNos?.Split(','); // 精确匹配 musts.AddIf(x => x.CustomId > 0, c => c.Term(f => f.CustomId, input.CustomId)); musts.AddIf(_ => orderNos?.Length > 0, c => c.Terms(f => f.Field(d => d.OrderNo.Suffix("keyword")).Terms(orderNos))); musts.AddIf(x => x.OrderType > 0, c => c.Term(f => f.OrderType, input.OrderType)); musts.AddIf(x => x.Status > 0, c => c.Term(f => f.Status, input.Status)); musts.AddIf(x => x.CustomId > 0, c => c.Term(f => f.CustomId, input.CustomId)); musts.AddIf(x => !string.IsNullOrWhiteSpace(x.WarningName), c => c.Term(f => f.WarningName, input.WarningName)); musts.AddIf(x => x.CreateTimeStart.HasValue, c => c.DateRange(r => r.Field(f => f.CreateTime).GreaterThanOrEquals(input.CreateTimeStart))); musts.AddIf(x => x.CreateTimeEnd.HasValue, c => c.DateRange(r => r.Field(f => f.CreateTime).LessThanOrEquals(input.CreateTimeEnd))); // 模糊匹配userId musts.AddIf(x => x.NotifyUserId.HasValue, c => c.Match(f => f.Field(d => d.NotifyUsers).Query(input.NotifyUserId.ToString()))); var resp = await _client.SearchAsync(x => x .Index(GlobalConst.TransportWarningDetailsIndex) .Query(q => q.Bool(b => b.Must(musts))) .From((input.PageIndex - 1) * input.PageSize) .Size(input.PageSize)); return new UnifyPageResultDto(resp.ToIdList(), input.PageIndex, input.PageSize, (int) resp.Total); } public async Task> GetTransportWarningDetailsAsync(HashSet ruleItemIds, HashSet status) { var r = await _client.SearchAsync(x => x .Index(GlobalConst.TransportWarningDetailsIndex) .Query(q => q .Bool(b => b .Must( mu => mu.Terms(t => t.Field(f => f.WarningSceneRuleItemId).Terms(ruleItemIds)), mu => mu.Terms(t => t.Field(f => f.Status).Terms(status))) ))); return r.Documents.ToList(); } public async Task UpdateTransportWarningDetailsAsync(TransportWarningDetailsIndex detail) { var r = await _client.UpdateAsync(detail.Id, u => u.Index(detail.IndexName) .Doc(new { detail.WarningId, detail.WarningSceneId, detail.WarningSceneRuleItemId, detail.Version, detail.WarningName, detail.WarningRuleDescription, detail.TransportTimeSpan, detail.StartTrackWarningTimeSpan, //detail.NotifyModes, detail.NotifyUsers, detail.SubSystemId, detail.CustomId, detail.CustomName, detail.OrderId, detail.OrderNo, detail.OrderType, detail.StartTrackStatusId, detail.StartTrackContentId, detail.StartTrackTime, detail.StartTrackTimeZone, detail.EndTrackStatusId, detail.EndTrackContentId, detail.EndTrackTime, detail.EndTrackTimeZone, // detail.LatestTrackContentId, // detail.LatestTrackContent, // detail.LatestTrackTime, // detail.LatestTrackTimeZone, // detail.LatestTrackPlace, detail.CumulativeTimeSpan, detail.Status, detail.CreateTime, })); } public async Task BulkUpdateTransportWarningDetailsAsync(List details, int maxRetries = 3) { if (details.Count == 0) return; //构建批量更新操作描述符 var desc = new BulkDescriptor().UpdateMany(details, (u, detail) => u.Id(detail.Id) .Index(detail.IndexName) .Script(s => s.Source(@" ctx._source.WarningId = param.WarningId; ctx._source.WarningSceneId = param.WarningSceneId; ctx._source.WarningSceneRuleItemId = param.WarningSceneRuleItemId; ctx._source.Version = param.Version; ctx._source.WarningName = param.WarningName; ctx._source.WarningRuleDescription = param.WarningRuleDescription; ctx._source.TransportTimeSpan = param.TransportTimeSpan; ctx._source.StartTrackWarningTimeSpa = param.StartTrackWarningTimeSpa;n //ctx._source.NotifyModes = param.NotifyModes; ctx._source.NotifyUsers = param.NotifyUsers; ctx._source.SubSystemId = param.SubSystemId; ctx._source.CustomId = param.CustomId; ctx._source.CustomName = param.CustomName; ctx._source.OrderId = param.OrderId; ctx._source.OrderNo = param.OrderNo; ctx._source.OrderType = param.OrderType; ctx._source.StartTrackStatusId = param.StartTrackStatusId; ctx._source.StartTrackContentId = param.StartTrackContentId; ctx._source.StartTrackTime = param.StartTrackTime; ctx._source.StartTrackTimeZone = param.StartTrackTimeZone; ctx._source.EndTrackStatusId = param.EndTrackStatusId; ctx._source.EndTrackContentId = param.EndTrackContentId; ctx._source.EndTrackTime = param.EndTrackTime; ctx._source.EndTrackTimeZone = param.EndTrackTimeZone; //ctx._source.LatestTrackContentId = param.LatestTrackContentId; //ctx._source.LatestTrackContent = param.LatestTrackContent; //ctx._source.LatestTrackTime = param.LatestTrackTime; //ctx._source.LatestTrackTimeZone = param.LatestTrackTimeZone; //ctx._source.LatestTrackPlace = param.LatestTrackPlace; ctx._source.CumulativeTimeSpan = param.CumulativeTimeSpan; ctx._source.Status = param.Status; ctx._source.CreateTime = param.CreateTime; ").Params(p => p .Add("WarningId", detail.WarningId) .Add("WarningSceneId", detail.WarningSceneId) .Add("WarningSceneRuleItemId", detail.WarningSceneRuleItemId) .Add("Version", detail.Version) .Add("WarningName", detail.WarningName) .Add("WarningRuleDescription", detail.WarningRuleDescription) .Add("TransportTimeSpan", detail.TransportTimeSpan) .Add("StartTrackWarningTimeSpan", detail.StartTrackWarningTimeSpan) //.Add("NotifyModes", detail.NotifyModes) .Add("NotifyUsers", detail.NotifyUsers) .Add("SubSystemId", detail.SubSystemId) .Add("CustomId", detail.CustomId) .Add("CustomName", detail.CustomName) .Add("OrderId", detail.OrderId) .Add("OrderNo", detail.OrderNo) .Add("OrderType", detail.OrderType) .Add("StartTrackStatusId", detail.StartTrackStatusId) .Add("StartTrackContentId", detail.StartTrackContentId) .Add("StartTrackTime", detail.StartTrackTime) .Add("StartTrackTimeZone", detail.StartTrackTimeZone) .Add("EndTrackStatusId", detail.EndTrackStatusId) .Add("EndTrackContentId", detail.EndTrackContentId) .Add("EndTrackTime", detail.EndTrackTime) .Add("EndTrackTimeZone", detail.EndTrackTimeZone) // .Add("LatestTrackContentId", detail.LatestTrackContentId) // .Add("LatestTrackContent", detail.LatestTrackContent) // .Add("LatestTrackTime", detail.LatestTrackTime) // .Add("LatestTrackTimeZone", detail.LatestTrackTimeZone) // .Add("LatestTrackPlace", detail.LatestTrackPlace) // .Add("CumulativeTimeSpan", detail.CumulativeTimeSpan) .Add("Status", detail.Status) .Add("CreateTime", detail.CreateTime) ))); await PollyHelper.RetryPollyExecAsync(() => _client.BulkAsync(desc), response => { if (response.IsValid) // 认为成功 return true; if (response.ServerError.Status == 409) //版本冲突认为失败,则重试 return false; throw new InvalidOperationException($"ES更新失败:{details.Count}条,原因:{response.DebugInformation}。"); }); } public async Task BulkCloseTransportWarningDetailsAsync(HashSet detailIds, int maxRetries = 3) { var status = new HashSet(2) { TransportWarningStatus.即将超时.GetHashCode(), TransportWarningStatus.已超时.GetHashCode() }; var r = await _client.UpdateByQueryAsync(u => u.Index(GlobalConst.TransportWarningDetailsIndex) .Query(q => q .Bool(b => b.Must( mu => mu.Terms(t => t.Field(f => f.Status).Terms(status)), mu => mu.Terms(t => t.Field(f => f.Id).Terms(detailIds)) ) ) ) .Script(s => s .Source("ctx._source.status = params.status") .Params(p => p.Add("status", (int) TransportWarningStatus.已关闭)) ) ); if (!r.IsValid) { throw new InvalidOperationException( $"运输时效预警明细更新失败,detailsIds:{detailIds},原因:{r.DebugInformation}。"); } } public async Task BulkCloseTransportWarningDetailsAsync(HashSet ruleItemIds, int maxRetries = 3) { var status = new HashSet(2) { TransportWarningStatus.即将超时.GetHashCode(), TransportWarningStatus.已超时.GetHashCode() }; var r = await _client.UpdateByQueryAsync(u => u.Index(GlobalConst.TransportWarningDetailsIndex) .Query(q => q .Bool(b => b.Must( mu => mu.Terms(t => t.Field(f => f.Status).Terms(status)), mu => mu.Terms(t => t.Field(f => f.WarningSceneRuleItemId).Terms(ruleItemIds)) ) ) ) .Script(s => s .Source("ctx._source.status = params.status") .Params(p => p.Add("status", (int) TransportWarningStatus.已关闭)) ) ); if (!r.IsValid) { throw new InvalidOperationException( $"运输时效预警明细更新失败,ruleItemIds:{ruleItemIds},原因:{r.DebugInformation}。"); } } public async Task InsertTransportWarningDetailsAsync(TransportWarningDetailsIndex detail) { var indexName = $"{GlobalConst.TransportWarningDetailsIndex}-{DateTime.Now:yyyy.MM.dd}"; detail.IndexName = indexName; var r = await _client.IndexAsync(detail, s => s.Index(indexName)); if (!r.IsValid) { throw new InvalidOperationException($"运输预警明细新增失败,{detail},原因:{r.DebugInformation}。"); } } public async Task BulkInsertTransportWarningDetailsAsync(List details, int maxRetries = 3) { // 按天写入es var indexName = $"{GlobalConst.TransportWarningDetailsIndex}-{DateTime.Now:yyyy.MM.dd}"; details.ForEach(x => x.IndexName = indexName); var r = await _client.IndexManyAsync(details, indexName); if (!r.IsValid) { throw new InvalidOperationException($"运输预警明细新增失败,原因:{r.DebugInformation}。"); } } #endregion #region 回传时效 public async Task> GetPageReturnWarningDetailsAsync(GetPageReturnWarningDetailsInputVO input) { var musts = ListWrapperFactory.CreateListWrapper(input); var orderNos = input.OrderNos?.Split(','); // 精确匹配 musts.AddIf(x => x.SubSystemId > 0, c => c.Term(f => f.SubSystemId, input.SubSystemId)); musts.AddIf(_ => orderNos?.Length > 0, c => c.Terms(f => f.Field(d => d.OrderNo.Suffix("keyword")).Terms(orderNos))); musts.AddIf(x => x.OrderType > 0, c => c.Term(f => f.OrderType, input.OrderType)); musts.AddIf(x => x.Status > 0, c => c.Term(f => f.Status, input.Status)); musts.AddIf(x => x.CustomId > 0, c => c.Term(f => f.CustomId, input.CustomId)); musts.AddIf(x => x.TrackStatusId > 0, c => c.Term(f => f.TrackStatusId, input.TrackStatusId)); musts.AddIf(x => x.TrackContentId > 0, c => c.Term(f => f.TrackContentId, input.TrackContentId)); musts.AddIf(x => x.IsKpi.HasValue, c => c.Term(f => f.IsExistsKpi, input.IsKpi!.Value)); musts.AddIf(x => x.TrackTimeStart.HasValue, c => c.DateRange(r => r.Field(f => f.TrackTime).GreaterThanOrEquals(input.TrackTimeStart))); musts.AddIf(x => x.TrackTimeEnd.HasValue, c => c.DateRange(r => r.Field(f => f.TrackTime).LessThanOrEquals(input.TrackTimeEnd))); musts.AddIf(x => x.TrackCreateTimeStart.HasValue, c => c.DateRange(r => r.Field(f => f.TrackCreateTime).LessThanOrEquals(input.TrackCreateTimeStart))); musts.AddIf(x => x.TrackCreateTimeEnd.HasValue, c => c.DateRange(r => r.Field(f => f.TrackCreateTime).LessThanOrEquals(input.TrackCreateTimeEnd))); musts.AddIf(x => x.TrackReturnTimeStart.HasValue, c => c.DateRange(r => r.Field(f => f.TrackReturnTime).LessThanOrEquals(input.TrackReturnTimeStart))); musts.AddIf(x => x.TrackReturnTimeEnd.HasValue, c => c.DateRange(r => r.Field(f => f.TrackReturnTime).LessThanOrEquals(input.TrackReturnTimeEnd))); musts.AddIf(x => x.WarningCreateTimeStart.HasValue, c => c.DateRange(r => r.Field(f => f.CreateTime).LessThanOrEquals(input.WarningCreateTimeStart))); musts.AddIf(x => x.WarningCreateTimeEnd.HasValue, c => c.DateRange(r => r.Field(f => f.CreateTime).LessThanOrEquals(input.WarningCreateTimeEnd))); // 模糊匹配userId(json字符串包含userId) musts.AddIf(x => x.NotifyUserId.HasValue, c => c.Match(f => f.Field(d => d.NotifyUsers).Query(input.NotifyUserId.ToString()))); var resp = await _client.SearchAsync(x => x .Index(GlobalConst.ReturnWarningDetailsIndex) .Query(q => q.Bool(b => b.Must(musts))) .From((input.PageIndex - 1) * input.PageSize) .Size(input.PageSize)); return new UnifyPageResultDto(resp.ToIdList(), input.PageIndex, input.PageSize, (int) resp.Total); } public async Task> GetReturnMessageRecordListByIdAsync(string esId) { var resp = await _client.SearchAsync(x => x .Index(GlobalConst.ReturnMessageRecordIndex) .Query(q => q.Term(t => t.WarningDetailsId.Suffix("keyword"), esId)) .Size(1000) ); return resp.ToIdList(); } public async Task UpdateReturnWarningDetailsAsync(ReturnWarningDetailsIndex detail) { var r = await _client.UpdateAsync(detail.Id, u => u.Index(detail.IndexName) .Doc(new { detail.ReturnWarningRuleId, detail.WarningId, detail.Version, detail.ReturnTimeSpan, //detail.NotifyModes, detail.NotifyUsers, detail.SubSystemId, detail.CustomId, detail.OrderId, detail.OrderNo, detail.OrderType, detail.TrackStatusId, detail.TrackStatus, detail.CompareFields, detail.Extra, detail.TrackContentId, detail.TrackContent, detail.TrackCode, detail.TrackPlace, detail.TrackTime, detail.TrackTimeZone, detail.TrackCreateTime, detail.PushTrackStatus, detail.PushTrackCode, detail.PushTrackContent, detail.PushTrackEnContent, detail.TrackReturnTime, detail.RetryCount, detail.Status, detail.ActualReturnTimeSpan, detail.SystemReturnTimeSpan, detail.TrackCreateTimeSpan, detail.CreateTime, detail.UpdateTime, })); } public async Task BulkUpdateReturnWarningDetailsAsync(List details, int maxRetries = 3) { if (details.Count == 0) return; //构建批量更新操作描述符 var desc = new BulkDescriptor().UpdateMany(details, (u, detail) => u.Id(detail.Id) .Index(detail.IndexName) .Script(s => s.Source(@" ctx._source.ReturnWarningRuleId = param.ReturnWarningRuleId; ctx._source.WarningId = param.WarningId; ctx._source.Version = param.Version; ctx._source.ReturnTimeSpan = param.ReturnTimeSpan; //ctx._source.NotifyModes = param.NotifyModes; ctx._source.NotifyUsers = param.NotifyUsers; ctx._source.SubSystemId = param.SubSystemId; ctx._source.CustomId = param.CustomId; ctx._source.OrderId = param.OrderId; ctx._source.OrderNo = param.OrderNo; ctx._source.OrderType = param.OrderType; ctx._source.TrackStatusId = param.TrackStatusId; ctx._source.TrackStatus = param.TrackStatus; ctx._source.CompareFields = param.CompareFields; ctx._source.Extra = param.Extra; ctx._source.TrackContentId = param.TrackContentId; ctx._source.TrackContent = param.TrackContent; ctx._source.TrackCode = param.TrackCode; ctx._source.TrackPlace = param.TrackPlace; ctx._source.TrackTime = param.TrackTime; ctx._source.TrackTimeZone = param.TrackTimeZone; ctx._source.TrackCreateTime = param.TrackCreateTime; ctx._source.PushTrackStatus = param.PushTrackStatus; ctx._source.PushTrackCode = param.PushTrackCode; ctx._source.PushTrackContent = param.PushTrackContent; ctx._source.PushTrackEnContent = param.PushTrackEnContent; ctx._source.TrackReturnTime = param.TrackReturnTime; ctx._source.RetryCount = param.RetryCount; ctx._source.Status = param.Status; ctx._source.ActualReturnTimeSpan = param.ActualReturnTimeSpan; ctx._source.SystemReturnTimeSpan = param.SystemReturnTimeSpan; ctx._source.TrackCreateTimeSpan = param.TrackCreateTimeSpan; ctx._source.CreateTime = param.CreateTime; ctx._source.UpdateTime = param.UpdateTime; ").Params(p => p .Add("ReturnWarningRuleId", detail.ReturnWarningRuleId) .Add("WarningId", detail.WarningId) .Add("Version", detail.Version) .Add("ReturnTimeSpan", detail.ReturnTimeSpan) //.Add("NotifyModes", detail.NotifyModes) .Add("NotifyUsers", detail.NotifyUsers) .Add("SubSystemId", detail.SubSystemId) .Add("CustomId", detail.CustomId) .Add("OrderId", detail.OrderId) .Add("OrderNo", detail.OrderNo) .Add("OrderType", detail.OrderType) .Add("TrackStatusId", detail.TrackStatusId) .Add("TrackStatus", detail.TrackStatus) .Add("CompareFields", detail.CompareFields) .Add("Extra", detail.Extra) .Add("TrackContentId", detail.TrackContentId) .Add("TrackContent", detail.TrackContent) .Add("TrackCode", detail.TrackCode) .Add("TrackPlace", detail.TrackPlace) .Add("TrackTime", detail.TrackTime) .Add("TrackTimeZone", detail.TrackTimeZone) .Add("TrackCreateTime", detail.TrackCreateTime) .Add("PushTrackStatus", detail.PushTrackStatus) .Add("PushTrackCode", detail.PushTrackCode) .Add("PushTrackContent", detail.PushTrackContent) .Add("PushTrackEnContent", detail.PushTrackEnContent) .Add("TrackReturnTime", detail.TrackReturnTime) .Add("RetryCount", detail.RetryCount) .Add("Status", detail.Status) .Add("ActualReturnTimeSpan", detail.ActualReturnTimeSpan) .Add("SystemReturnTimeSpan", detail.SystemReturnTimeSpan) .Add("TrackCreateTimeSpan", detail.TrackCreateTimeSpan) .Add("CreateTime", detail.CreateTime) .Add("UpdateTime", detail.UpdateTime) ) ) ); await PollyHelper.RetryPollyExecAsync(() => _client.BulkAsync(desc), response => { if (response.IsValid) // 认为成功 return true; if (response.ServerError.Status == 409) //版本冲突认为失败,则重试 return false; throw new InvalidOperationException($"ES更新失败:{details.Count}条,原因:{response.DebugInformation}。"); }); } public async Task InsertReturnWarningDetailsAsync(ReturnWarningDetailsIndex detail) { var indexName = $"{GlobalConst.ReturnWarningDetailsIndex}-{DateTime.Now:yyyy.MM.dd}"; detail.IndexName = indexName; var r = await _client.IndexAsync(detail, s => s.Index(indexName)); if (!r.IsValid) { throw new InvalidOperationException($"回传预警明细新增失败,{detail},原因:{r.DebugInformation}。"); } } public async Task BulkInsertReturnWarningDetailsAsync(List details, int maxRetries = 3) { // 按天写入es var indexName = $"{GlobalConst.ReturnWarningDetailsIndex}-{DateTime.Now:yyyy.MM.dd}"; details.ForEach(x => x.IndexName = indexName); var r = await _client.IndexManyAsync(details, indexName); if (!r.IsValid) { throw new InvalidOperationException($"回传预警明细新增失败,原因:{r.DebugInformation}。"); } } public async Task InsertReturnMessageRecordAsync(ReturnMessageRecordIndex detail) { var indexName = $"{GlobalConst.ReturnMessageRecordIndex}-{DateTime.Now:yyyy.MM.dd}"; detail.IndexName = indexName; var r = await _client.IndexAsync(detail, s => s.Index(indexName)); if (!r.IsValid) { throw new InvalidOperationException($"回传日志新增失败,{detail},原因:{r.DebugInformation}。"); } } public async Task BulkInsertReturnMessageRecordAsync(List details, int maxRetries = 3) { // 按天写入es var indexName = $"{GlobalConst.ReturnMessageRecordIndex}-{DateTime.Now:yyyy.MM.dd}"; details.ForEach(x => x.IndexName = indexName); var r = await _client.IndexManyAsync(details, indexName); if (!r.IsValid) { throw new InvalidOperationException($"回传日志新增失败,原因:{r.DebugInformation}。"); } } #endregion #region 完整 public async Task> GetPageCompleteWarningDetailsAsync(GetPageCompleteWarningDetailsInputVO input) { var musts = ListWrapperFactory.CreateListWrapper(input); var orderNos = input.OrderNos?.Split(','); musts.AddIf(x => x.SubSystemId > 0, c => c.Term(f => f.SubSystemId, input.SubSystemId)); musts.AddIf(_ => orderNos?.Length > 0, c => c.Terms(f => f.Field(d => d.OrderNo.Suffix("keyword")).Terms(orderNos))); musts.AddIf(x => x.OrderType > 0, c => c.Term(f => f.OrderType, input.OrderType)); musts.AddIf(x => x.Status > 0, c => c.Term(f => f.Status, input.Status)); musts.AddIf(x => x.CustomId > 0, c => c.Term(f => f.CustomId, input.CustomId)); musts.AddIf(x => x.MissingTrackStatusId > 0, c => c.Match(f => f.Field(d => d.MissingTrackStatusIds).Query(input.MissingTrackStatusId.ToString()))); musts.AddIf(x => x.WarningCreateTimeStart.HasValue, c => c.DateRange(r => r.Field(f => f.CreateTime).LessThanOrEquals(input.WarningCreateTimeStart))); musts.AddIf(x => x.WarningCreateTimeEnd.HasValue, c => c.DateRange(r => r.Field(f => f.CreateTime).LessThanOrEquals(input.WarningCreateTimeEnd))); musts.AddIf(x => x.WarningHandleTimeStart.HasValue, c => c.DateRange(r => r.Field(f => f.ProcessedTime).LessThanOrEquals(input.WarningHandleTimeStart))); musts.AddIf(x => x.WarningHandleTimeEnd.HasValue, c => c.DateRange(r => r.Field(f => f.ProcessedTime).LessThanOrEquals(input.WarningHandleTimeEnd))); // 模糊匹配userId musts.AddIf(x => x.NotifyUserId.HasValue, c => c.Match(f => f.Field(d => d.NotifyUsers).Query(input.NotifyUserId.ToString()))); var resp = await _client.SearchAsync(x => x .Index(GlobalConst.CompleteWarningDetailsIndex) .Query(q => q.Bool(b => b.Must(musts))) .From((input.PageIndex - 1) * input.PageSize) .Size(input.PageSize)); return new UnifyPageResultDto(resp.ToIdList(), input.PageIndex, input.PageSize, (int) resp.Total); } public async Task UpdateCompleteWarningDetailsAsync(CompleteWarningDetailsIndex detail) { var r = await _client.UpdateAsync(detail.Id, u => u.Index(detail.IndexName) .Doc(new { detail.WarningId, detail.CompleteWarningRuleId, detail.Version, //detail.NotifyModes, detail.NotifyUsers, detail.CheckPointTrackStatusId, detail.MissingTrackStatusIds, detail.SubSystemId, detail.CustomId, detail.OrderId, detail.OrderNo, detail.OrderType, detail.Status, detail.CreateTime, detail.ProcessedTime, })); } public async Task BulkUpdateCompleteWarningDetailsAsync(List details, int maxRetries = 3) { if (details.Count == 0) return; //构建批量更新操作描述符 var desc = new BulkDescriptor().UpdateMany(details, (u, detail) => u.Id(detail.Id) .Index(detail.IndexName) .Script(s => s.Source(@" ctx._source.WarningId = param.WarningId; ctx._source.CompleteWarningRuleId = param.CompleteWarningRuleId; ctx._source.Version = param.Version; //ctx._source.NotifyModes = param.NotifyModes; ctx._source.NotifyUsers = param.NotifyUsers; ctx._source.CheckPointTrackStatusId = param.CheckPointTrackStatusId; ctx._source.MissingTrackStatusIds = param.MissingTrackStatusIds; ctx._source.SubSystemId = param.SubSystemId; ctx._source.CustomId = param.CustomId; ctx._source.OrderId = param.OrderId; ctx._source.OrderNo = param.OrderNo; ctx._source.OrderType = param.OrderType; ctx._source.Status = param.Status; ctx._source.CreateTime = param.CreateTime; ctx._source.ProcessedTime = param.ProcessedTime; ") .Params(p => p .Add("WarningId", detail.WarningId) .Add("CompleteWarningRuleId", detail.CompleteWarningRuleId) .Add("Version", detail.Version) //.Add("NotifyModes", detail.NotifyModes) .Add("NotifyUsers", detail.NotifyUsers) .Add("CheckPointTrackStatusId", detail.CheckPointTrackStatusId) .Add("MissingTrackStatusIds", detail.MissingTrackStatusIds) .Add("SubSystemId", detail.SubSystemId) .Add("CustomId", detail.CustomId) .Add("OrderId", detail.OrderId) .Add("OrderNo", detail.OrderNo) .Add("OrderType", detail.OrderType) .Add("Status", detail.Status) .Add("CreateTime", detail.CreateTime) .Add("ProcessedTime", detail.ProcessedTime) ) ) ); await PollyHelper.RetryPollyExecAsync(() => _client.BulkAsync(desc), response => { if (response.IsValid) // 认为成功 return true; if (response.ServerError.Status == 409) //版本冲突认为失败,则重试 return false; throw new InvalidOperationException($"ES更新失败:{details.Count}条,原因:{response.DebugInformation}。"); }); } public async Task InsertCompleteWarningDetailsAsync(CompleteWarningDetailsIndex detail) { var indexName = $"{GlobalConst.CompleteWarningDetailsIndex}-{DateTime.Now:yyyy.MM.dd}"; detail.IndexName = indexName; var r = await _client.IndexAsync(detail, s => s.Index(indexName)); if (!r.IsValid) { throw new InvalidOperationException($"完整预警明细新增失败,{detail},原因:{r.DebugInformation}。"); } } public async Task BulkInsertCompleteWarningDetailsAsync(List details, int maxRetries = 3) { // 按天写入es var indexName = $"{GlobalConst.CompleteWarningDetailsIndex}-{DateTime.Now:yyyy.MM.dd}"; details.ForEach(x => x.IndexName = indexName); var r = await _client.IndexManyAsync(details, indexName); if (!r.IsValid) { throw new InvalidOperationException($"完整预警明细新增失败,原因:{r.DebugInformation}。"); } } #endregion public async Task CreateAliasAsync() { var indexName1 = $"{GlobalConst.TransportWarningDetailsIndex}-{DateTime.Now:yyyy.MM.dd}"; var indexName2 = $"{GlobalConst.ReturnWarningDetailsIndex}-{DateTime.Now:yyyy.MM.dd}"; var indexName3 = $"{GlobalConst.CompleteWarningDetailsIndex}-{DateTime.Now:yyyy.MM.dd}"; var indexName4 = $"{GlobalConst.ReturnMessageRecordIndex}-{DateTime.Now:yyyy.MM.dd}"; var exists1 = await _client.Indices.ExistsAsync(indexName1); if (!exists1.Exists) { await _client.Indices.CreateAsync(indexName1); await _client.MapAsync(m => m.Index(indexName1).AutoMap()); } var exists2 = await _client.Indices.ExistsAsync(indexName2); if (!exists2.Exists) { await _client.Indices.CreateAsync(indexName2); await _client.MapAsync(m => m.Index(indexName2).AutoMap()); } var exists3 = await _client.Indices.ExistsAsync(indexName3); if (!exists3.Exists) { await _client.Indices.CreateAsync(indexName3); await _client.MapAsync(m => m.Index(indexName3).AutoMap()); } var exists4 = await _client.Indices.ExistsAsync(indexName4); if (!exists4.Exists) { await _client.Indices.CreateAsync(indexName4); await _client.MapAsync(m => m.Index(indexName4).AutoMap()); } var r = await _client.Indices.BulkAliasAsync(b => b.Add(a => a.Alias(GlobalConst.TransportWarningDetailsIndex).Index(indexName1)) .Add(a => a.Alias(GlobalConst.ReturnWarningDetailsIndex).Index(indexName2)) .Add(a => a.Alias(GlobalConst.CompleteWarningDetailsIndex).Index(indexName3)) .Add(a => a.Alias(GlobalConst.ReturnMessageRecordIndex).Index(indexName4)) ); } }