diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs
index 276ad83b..bd7a5c2f 100644
--- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs
+++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs
@@ -44,9 +44,15 @@ public class BatchUpsertTrackInput : OrderNosInfo
///
/// 客户是否可见
///
- [Required]
+ [Obsolete("废弃的,请使用IsExternal")]
public bool IsVisibility { get; set; }
+ ///
+ /// 是否对外(可选的)
+ /// 如果未填则按照【轨迹内容】中的【是否可见】做为默认值
+ ///
+ public bool? IsExternal { get; set; }
+
///
/// 数据来源:1外部服务商创建,2内部系统创建,3人工创建
/// 批量新增时使用指定轨迹来源,更新时无需指定
diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/FileItemDto.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/FileItemDto.cs
index f483a7ab..d39bf488 100644
--- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/FileItemDto.cs
+++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/FileItemDto.cs
@@ -11,4 +11,9 @@ public class FileItemDto
/// 文件名称
///
public string FileName { get; set; }
+
+ ///
+ /// 文件下载地址
+ ///
+ public string? DownloadUrl { get; set; }
}
diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetOrderDetailsInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetOrderDetailsInput.cs
index 23cdaec4..7aab1d65 100644
--- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetOrderDetailsInput.cs
+++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetOrderDetailsInput.cs
@@ -72,6 +72,12 @@ public class TrackOrderDetailDto
///
public float TrackTimeZoneValue { get; set; }
+ ///
+ /// 客户是否可见
+ ///
+ [Obsolete("废弃的,请使用IsExternal")]
+ public bool IsVisibility { get; set; }
+
///
/// 是否对外
///
@@ -87,11 +93,6 @@ public class TrackOrderDetailDto
///
public string? CreateUser { get; set; }
- ///
- /// 客户是否可见
- ///
- public bool IsVisibility { get; set; }
-
///
/// 数据来源:1外部服务商创建,2内部系统创建,3人工创建
///
diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs
index f5313b3b..e03a46f0 100644
--- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs
+++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs
@@ -19,6 +19,7 @@ public class TrackDetail
public string Code { get; set; } = null!;
public string Status { get; set; } = null!;
public string? Content { get; set; }
+ public string? EnContent { get; set; }
public string? OriginContent { get; set; }
public string Location { get; set; } = null!;
@@ -35,13 +36,20 @@ public class TrackDetail
///
/// 是否对外
///
+ [Obsolete("废弃的,请使用IsExternal")]
public bool IsDisplay { get; set; }
///
/// 客户是否可见
///
+ [Obsolete("废弃的,请使用IsExternal")]
public bool IsVisibility { get; set; }
+ ///
+ /// 是否对外
+ ///
+ public bool IsExternal { get; set; }
+
///
/// 数据来源:1外部服务商创建,2内部系统创建,3人工创建
///
diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs
index def0e322..961841a6 100644
--- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs
+++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs
@@ -49,9 +49,15 @@ public class UpsertTrackInput : OrderNoInfo
///
/// 客户是否可见
///
- [Required]
+ [Obsolete("废弃的,请使用IsExternal")]
public bool IsVisibility { get; set; }
+ ///
+ /// 是否对外(可选的)
+ /// 如果未填则按照【轨迹内容】中的【是否可见】做为默认值
+ ///
+ public bool? IsExternal { get; set; }
+
///
/// 数据来源:1外部服务商创建,2内部系统创建,3人工创建
///
diff --git a/src/SJZY.Track.Application.Contract/Events/TrackChangeEto.cs b/src/SJZY.Track.Application.Contract/Events/TrackChangeEto.cs
index 6319446e..804ad6d5 100644
--- a/src/SJZY.Track.Application.Contract/Events/TrackChangeEto.cs
+++ b/src/SJZY.Track.Application.Contract/Events/TrackChangeEto.cs
@@ -72,8 +72,14 @@ public class TrackChangeEto
///
/// 客户是否可见
///
+ [Obsolete("废弃的,请使用IsExternal")]
public bool IsVisibility { get; set; }
+ ///
+ /// 是否对外
+ ///
+ public bool IsExternal { get; set; }
+
///
/// 数据来源:1外部服务商创建,2内部系统创建,3人工创建
///
diff --git a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs
index fef7ab3f..182672cb 100644
--- a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs
+++ b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs
@@ -74,8 +74,14 @@ public class TrackUpsertEvent
///
/// 客户是否可见
///
+ [Obsolete("废弃的,请使用IsExternal")]
public bool IsVisibility { get; set; }
+ ///
+ /// 是否对外
+ ///
+ public bool? IsExternal { get; set; }
+
///
/// 数据来源:1外部服务商创建,2内部系统创建,3人工创建
///
diff --git a/src/SJZY.Track.Application.Contract/Services/IBroadcastingService.cs b/src/SJZY.Track.Application.Contract/Services/IBroadcastingService.cs
index 782126bb..238f015b 100644
--- a/src/SJZY.Track.Application.Contract/Services/IBroadcastingService.cs
+++ b/src/SJZY.Track.Application.Contract/Services/IBroadcastingService.cs
@@ -10,17 +10,10 @@ public interface IBroadcastingService : ITransientDependency
/// 轨迹变更广播(新增/修改)
///
///
+ ///
///
///
- void TrackChangePublicTopic(TrackUpsertEvent eto, string subSystemCode, string trackStatusCode);
-
- ///
- /// 轨迹变更广播(删除)
- ///
- ///
- ///
- ///
- void TrackChangePublicTopic(TrackDeleteEvent eto, OrderIdentifier[] orderIdentifiers, string trackCode, string trackStatusCode, string subSystemCode);
+ void TrackChangePublicTopic(TrackUpsertEvent eto,bool contentIsExternal, string subSystemCode, string trackStatusCode);
///
/// 轨迹变更广播(删除)
diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs
index e1c416d0..5ce98e81 100644
--- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs
+++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs
@@ -339,6 +339,7 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe
Remarks = track.Remarks,
Source = track.Source,
IsVisibility = track.IsVisibility,
+ IsExternal = track.IsExternal,
TrackTimeZone = track.TrackTimeZone,
TrackTime = track.TrackTime,
TrackPlace = track.TrackPlace,
diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs
index f8d2cc5a..8a657ad2 100644
--- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs
+++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs
@@ -56,7 +56,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
// 处理广播事件
if (content != null && (content.IsToMq || @event.IsToMq))
- _ = EnsureWriteAfterPublicTopicAsync(@event, content.SubSystemCode, content.TrackStatusCode);
+ _ = EnsureWriteAfterPublicTopicAsync(@event, content.IsExternal, content.SubSystemCode, content.TrackStatusCode);
if (canNextOrderIds.Count == 0) return;
// 根据订单关联关系异步向下刷(异步)
@@ -144,8 +144,6 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
return false;
}
- // todo: 在这里,判断存在性
-
return true;
}
@@ -157,7 +155,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
{
// 找不到轨迹内容,直接结束
LogHelper.Warn($"找不到轨迹内容:{@event}", true);
- return default;
+ return null;
}
//#7001:未来潜在需求,当轨迹内容匹配预设,记录一个标记,保证下刷过程都是使用预设内容
@@ -302,13 +300,15 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
{
if (existTracks.Count > 1)
{
- // todo: 所有的event handle 多写log,取缔注释,特别是continue,return,这种跳出的地方,方便排查问题
_logger.LogInformation("订单存在多条轨迹不允许修改:{@event}", @event);
continue;
}
- // todo:例如这里
- if (track == null) continue; // 不存在不让改
+ if (track == null)
+ {
+ _logger.LogInformation("订单不存在轨迹不允许修改:{@event}", @event);
+ continue; // 不存在不让改
+ }
updateTracks.Add(BuiltUpdateTrack(@event, track, order, trackContent));
operationRecords.Add(BuildOrderOperationRecord(@event, track, order));
@@ -316,7 +316,11 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
else
{
// 不允许重复轨迹,跳过
- if (!trackContent.IsRepeatable && existTracks.Count > 0) continue;
+ if (!trackContent.IsRepeatable && existTracks.Count > 0)
+ {
+ _logger.LogInformation("订单已经存在不允许重复的轨迹,不允许重复添加:{@event}", @event);
+ continue;
+ }
insertTracks.Add(BuiltNewTrack(@event, order, trackContent));
}
@@ -359,6 +363,8 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
track.TrackEnContent = @event.EnStatus ?? trackContent.TrackEnContent;
//S06新增
track.IsVisibility = @event.IsVisibility;
+ //当传入的IsExternal为空,则使用轨迹内容中的IsExternal
+ track.IsExternal = @event.IsExternal ?? trackContent.IsExternal;
track.Remarks = @event.Remarks ?? GlobalConst.EmptyString;
track.Files = @event.Files?.Select(x => new FileItem
{
@@ -406,6 +412,8 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
TrackEnContent = @event.EnStatus ?? trackContent.TrackEnContent,
//S06新增轨迹明细字段
IsVisibility = @event.IsVisibility,
+ //当传入的IsExternal为空,则使用轨迹内容中的IsExternal
+ IsExternal = @event.IsExternal ?? trackContent.IsExternal,
Source = @event.Source,
Remarks = @event.Remarks ?? GlobalConst.EmptyString,
Files = @event.Files?.Select(x => new FileItem
@@ -446,7 +454,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
};
}
- private async Task EnsureWriteAfterPublicTopicAsync(TrackUpsertEvent @event, string subSystemCode, string statusCode)
+ private async Task EnsureWriteAfterPublicTopicAsync(TrackUpsertEvent @event, bool contentIsExternal, string subSystemCode, string statusCode)
{
//理想情况在写入之后1s会刷盘 https://www.elastic.co/guide/en/elasticsearch/reference/master/indices-refresh.html
//增加一个版本号来确定是否真的变更了
@@ -455,6 +463,6 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
//方案2:考虑强制刷盘(对es压力大)后发送
//方案3:采用一个较大延时,不查询直接发
await Task.Delay(1000);
- _broadcastingService.TrackChangePublicTopic(@event, subSystemCode, statusCode);
+ _broadcastingService.TrackChangePublicTopic(@event, contentIsExternal, subSystemCode, statusCode);
}
}
diff --git a/src/SJZY.Track.Application/Localization/Resources/en.json b/src/SJZY.Track.Application/Localization/Resources/en.json
index c7d369bc..dd092982 100644
--- a/src/SJZY.Track.Application/Localization/Resources/en.json
+++ b/src/SJZY.Track.Application/Localization/Resources/en.json
@@ -10,6 +10,7 @@
"TrackFlagExist": "Duplicate code or flag in the current subsystem",
"IsExistTrackPullConfig": "Track Pull The template has been bound. Delete the track pull before deleting the template",
"IsExistTrackStatus": "The trajectory content has been bound to the trajectory status. Delete the trajectory content before deleting the trajectory status",
- "IsExistTrackFlag": "The track content has been bound to the track mark. Delete the track content before deleting the track mark"
+ "IsExistTrackFlag": "The track content has been bound to the track mark. Delete the track content before deleting the track mark",
+ "IsTrackPushConfigAny": "This subsystem already has the push mapping of this customer, and it cannot be added repeatedly"
}
-}
\ No newline at end of file
+}
diff --git a/src/SJZY.Track.Application/Localization/Resources/zh.json b/src/SJZY.Track.Application/Localization/Resources/zh.json
index 38db9ebb..b33ac103 100644
--- a/src/SJZY.Track.Application/Localization/Resources/zh.json
+++ b/src/SJZY.Track.Application/Localization/Resources/zh.json
@@ -10,6 +10,7 @@
"TrackFlagExist": "当前子系统下代码或标记重复",
"IsExistTrackPullConfig": "轨迹拉取已绑定了该模版,请先删除轨迹拉取再删除该模版",
"IsExistTrackStatus": "轨迹内容已经绑定了该轨迹状态,请先删除轨迹内容后再删除该轨迹状态",
- "IsExistTrackFlag": "轨迹内容已经绑定了该轨迹标记,请先删除轨迹内容后再删除该轨迹标记"
+ "IsExistTrackFlag": "轨迹内容已经绑定了该轨迹标记,请先删除轨迹内容后再删除该轨迹标记",
+ "IsTrackPushConfigAny": "这个子系统已经存在这个客户的推送映射,无法重复添加"
}
-}
\ No newline at end of file
+}
diff --git a/src/SJZY.Track.Application/Rabbit/TrackRefreshEventHandler.cs b/src/SJZY.Track.Application/Rabbit/TrackRefreshEventHandler.cs
index 14e80f79..2903eb5e 100644
--- a/src/SJZY.Track.Application/Rabbit/TrackRefreshEventHandler.cs
+++ b/src/SJZY.Track.Application/Rabbit/TrackRefreshEventHandler.cs
@@ -261,7 +261,9 @@ public class TrackRefreshEventHandler : ITransientDependency, IRabbitHandler
IsAdd = true,
//S06新增
IsVisibility = false,
- Source = (int)TrackSourceEnum.ExternalServiceProvide,
+ //服务商轨迹默认不对外
+ IsExternal = false,
+ Source = (int) TrackSourceEnum.ExternalServiceProvide,
Remarks = null,
Files = null,
Content = null,
@@ -308,6 +310,8 @@ public class TrackRefreshEventHandler : ITransientDependency, IRabbitHandler
TrackEnContent = GlobalConst.EmptyString,
//S06新增轨迹明细字段
IsVisibility = false,
+ //服务商轨迹默认不对外
+ IsExternal = false,
Source = (int) TrackSourceEnum.ExternalServiceProvide,
Remarks = null,
Files = null,
@@ -315,7 +319,7 @@ public class TrackRefreshEventHandler : ITransientDependency, IRabbitHandler
TrackPlaceCityId = null,
TrackPlaceProvince = null,
TrackPlaceProvinceId = null,
- TrackPlaceNation =null,
+ TrackPlaceNation = null,
TrackPlaceNationId = null,
TrackPlacePostcode = null,
DestinationTimeZone = null,
diff --git a/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs b/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs
index 48345f81..9b790e89 100644
--- a/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs
+++ b/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs
@@ -23,10 +23,11 @@ public class BroadcastingService : IBroadcastingService
/// 轨迹变更广播
///
///
+ /// 轨迹内容中的是否对外
/// 子系统代码
/// 轨迹状态代码
///
- public void TrackChangePublicTopic(TrackUpsertEvent eto, string subSystemCode, string trackStatusCode)
+ public void TrackChangePublicTopic(TrackUpsertEvent eto, bool contentIsExternal, string subSystemCode, string trackStatusCode)
{
var data = new TrackChangeEto
{
@@ -42,8 +43,9 @@ public class BroadcastingService : IBroadcastingService
Remarks = eto.Remarks,
Source = eto.Source,
IsVisibility = eto.IsVisibility,
+ IsExternal = eto.IsExternal ?? contentIsExternal,
TrackTimeZone = eto.TrackTimeZone,
- TrackTime = eto.TrackTime,
+ TrackTime = eto.NewTrackTime ?? eto.TrackTime,
TrackPlace = eto.TrackPlace,
TrackStatusCode = trackStatusCode,
OrderNo = eto.OrderIdentifiers.First().OrderNo,
@@ -66,22 +68,6 @@ public class BroadcastingService : IBroadcastingService
Encoding.UTF8.GetBytes(data.ToJson()));
}
- public void TrackChangePublicTopic(TrackDeleteEvent eto, OrderIdentifier[] orderIdentifiers, string trackCode, string trackStatusCode, string subSystemCode)
- {
- var data = new TrackChangeEto
- {
- OrderIdentifiers = orderIdentifiers,
- TrackStatusCode = trackStatusCode,
- TrackCode = trackCode,
- OperationMan = eto.OperationMan,
- SubSystemId = eto.SubSystemId,
- Option = 2
- };
-
- _rabbitClientBus.Publish(GlobalConst.TrackChangeExchange, $"TrackChange.{subSystemCode}",
- Encoding.UTF8.GetBytes(data.ToJson()));
- }
-
public void TrackChangePublicTopic(TrackChangeEto eto, string subSystemCode)
{
eto.Option = 2;
diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs
index f6768eee..e5b184cb 100644
--- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs
+++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs
@@ -1,4 +1,5 @@
using Microsoft.AspNetCore.Http;
+using SJZY.Expand.AliyunOSS;
using SJZY.Track.Application.Contract.Dtos.ProvideServices;
using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
using SJZY.Track.Domain.Aggregates.TrackTemplateAggregate;
@@ -34,29 +35,21 @@ public partial class TrackService
//内部子系统不过滤外部轨迹
var isFilterExternal = await HasFilterExternalTrack();
- // 是否对外
- var trackCodes = details.Select(x => x.TrackCode)
- .WhereIf(isFilterExternal, x => x != GlobalConst.EmptyString)
- .Distinct()
- .ToList();
-
- var trackContentDic = new Dictionary();
- if (!trackCodes.IsNullOrEmpty())
- {
- var trackContents = await _trackContentRepository.GetListAsync(x =>
- x.SubSystemId == input.SubSystemId && trackCodes.Contains(x.Code),
- x => new
- {
- x.Code,
- x.IsExternal
- });
- trackContents.ForEach(x => trackContentDic.Add(x.Code, x.IsExternal));
- }
+ var ossKeys = details
+ .Where(x => x.Files != null && x.Files.Count > 0)
+ .SelectMany(x => x.Files!.Select(y => y.OssKey))
+ .ToArray();
+ //根据osskey获取下载地址
+ var ossKeyUrlDict = OSSHelper.GetUrlByKeys(ossKeys);
foreach (var group in details.GroupBy(x => x.OrderId))
{
var item = new GetTrackOutput();
- var trackDetails = group.ToList();
+ var trackDetails = group
+ .WhereIf(isFilterExternal, x => x.IsExternal)
+ .ToList();
+ if (trackDetails.Count == 0)
+ continue;
item.OrderNo = trackDetails.First().OrderNo;
item.TrackDetails = trackDetails.Select(x => new TrackDetail
@@ -65,6 +58,7 @@ public partial class TrackService
Code = x.TrackCode,
Status = x.TrackStatus,
Content = x.TrackContent,
+ EnContent = x.TrackEnContent,
OriginContent = x.OriginTrackContent,
Location = x.TrackPlace,
Time = Math.Abs(x.TrackTimeZone - GlobalConst.NoneTrackTimeZone) < 1
@@ -73,14 +67,16 @@ public partial class TrackService
TimeZone = Math.Abs(x.TrackTimeZone - GlobalConst.NoneTrackTimeZone) < 1
? null
: input.TimeZone ?? 8,
- IsDisplay = trackContentDic.TryGetValue(x.TrackCode, out var isExternal) && isExternal,
+ IsDisplay = x.IsExternal,
IsVisibility = x.IsVisibility,
+ IsExternal = x.IsExternal,
Source = x.Source,
Remarks = x.Remarks,
Files = x.Files?.Select(y => new FileItemDto
{
FileName = y.FileName,
- OssKey = y.OssKey
+ OssKey = y.OssKey,
+ DownloadUrl = ossKeyUrlDict.TryGetValue(y.OssKey, out var url) ? url : null
}).ToList(),
TrackPlaceCity = x.TrackPlaceCity,
TrackPlaceCityId = x.TrackPlaceCityId,
@@ -97,6 +93,7 @@ public partial class TrackService
res.Add(item);
}
+
// 排序
var sortedList = await TracksOrdered(res, input, input.SortMethod);
@@ -120,29 +117,21 @@ public partial class TrackService
//内部子系统不过滤外部轨迹
var isFilterExternal = await HasFilterExternalTrack();
- // 是否对外
- var trackCodes = details.Select(x => x.TrackCode)
- .WhereIf(isFilterExternal, x => x != GlobalConst.EmptyString)
- .Distinct()
- .ToList();
-
- var trackContentDic = new Dictionary();
- if (!trackCodes.IsNullOrEmpty())
- {
- var trackContents = await _trackContentRepository.GetListAsync(x =>
- x.SubSystemId == input.SubSystemId && trackCodes.Contains(x.Code),
- x => new
- {
- x.Code,
- x.IsExternal
- });
- trackContents.ForEach(x => trackContentDic.Add(x.Code, x.IsExternal));
- }
+ var ossKeys = details
+ .Where(x => x.Files != null && x.Files.Count > 0)
+ .SelectMany(x => x.Files!.Select(y => y.OssKey))
+ .ToArray();
+ //根据osskey获取下载地址
+ var ossKeyUrlDict = OSSHelper.GetUrlByKeys(ossKeys);
foreach (var group in details.GroupBy(x => x.OrderId))
{
var item = new GetTrackOutput();
- var trackDetails = group.ToList();
+ var trackDetails = group
+ .WhereIf(isFilterExternal, x => x.IsExternal)
+ .ToList();
+ if (trackDetails.Count == 0)
+ continue;
item.OrderNo = trackDetails.First().OrderNo;
item.TrackDetails = trackDetails.Select(x => new TrackDetail
@@ -151,18 +140,21 @@ public partial class TrackService
Code = x.TrackCode,
Status = x.TrackStatus,
Content = x.TrackContent,
+ EnContent = x.TrackEnContent,
OriginContent = x.OriginTrackContent,
Location = x.TrackPlace,
Time = x.TrackTime,
TimeZone = x.TrackTimeZone,
- IsDisplay = trackContentDic.TryGetValue(x.TrackCode, out var isExternal) && isExternal,
+ IsDisplay = x.IsExternal,
IsVisibility = x.IsVisibility,
+ IsExternal = x.IsExternal,
Source = x.Source,
Remarks = x.Remarks,
Files = x.Files?.Select(y => new FileItemDto
{
FileName = y.FileName,
- OssKey = y.OssKey
+ OssKey = y.OssKey,
+ DownloadUrl = ossKeyUrlDict.TryGetValue(y.OssKey, out var url) ? url : null
}).ToList(),
TrackPlaceCity = x.TrackPlaceCity,
TrackPlaceCityId = x.TrackPlaceCityId,
diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs
index f52e1b17..b7b9e305 100644
--- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs
+++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs
@@ -399,6 +399,7 @@ public partial class TrackService : ApplicationService, ITrackService
OperationMan = userInfo.Data.UserName,
OperationManId = userInfo.Data.UserId,
IsVisibility = input.IsVisibility,
+ IsExternal = input.IsExternal,
Source = input.Source,
Remarks = input.Remarks,
Files = input.Files,
diff --git a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs
index 53bfc8c3..71487d75 100644
--- a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs
+++ b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs
@@ -141,24 +141,6 @@ public class TrackOrderService : ApplicationService
var list = ObjectMapper.Map, List>(trackDetails);
- var trackCodes = list.Select(x => x.Code)
- .Where(x => x != GlobalConst.EmptyString)
- .Distinct()
- .ToList();
-
- // 是否对外
- if (!trackCodes.IsNullOrEmpty())
- {
- var trackContents = await _trackContentRepository.GetListAsync(x =>
- x.SubSystemId == order.SubSystemId && trackCodes.Contains(x.Code), x => new
- {
- x.Code,
- x.IsExternal
- });
-
- list.ForEach(x => x.IsExternal = trackContents.FirstOrDefault(y => y.Code == x.Code)?.IsExternal ?? false);
- }
-
// 计算时区
list.ForEach(a =>
{
@@ -217,7 +199,7 @@ public class TrackOrderService : ApplicationService
foreach (var item in trackDetails)
{
//如果是外部系统,且轨迹内容不对外则跳过这条轨迹内容
- if (system.SystemProperty == 2 && !item.IsVisibility)
+ if (system.SystemProperty == 2 && !item.IsExternal)
continue;
//时间和时区任意一个为空则使用创建时间做为排序参照值
diff --git a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs
index 467ab9c0..183b02dd 100644
--- a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs
+++ b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/IOrderRepository.cs
@@ -15,10 +15,10 @@ public interface IOrderRepository : IBasicRepository
///
/// 通过三方平台和三方单号查询订单
///
- /// 三方平台
+ /// 三方平台
/// 三方平台单号
/// (主单号id,客户id)
- Task<(int MainOrderId, int CustomId)> GetTrackOrderByProviderAndOrderNo(string serviceProvidrCode, string orderNo);
+ Task<(int MainOrderId, int CustomId)> GetTrackOrderByProviderAndOrderNo(string serviceProviderCode, string orderNo);
///
/// 创建订单
diff --git a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs
index eaf3ca71..d6248fbe 100644
--- a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs
+++ b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs
@@ -186,12 +186,15 @@ public class OrderEntity : IFullAuditedBasicEntitys, IAggregateRoot
[SugarColumn(ColumnName = "TemplateCodes")]
public string? TemplateCodes { get; set; }
- [SugarColumn(IsIgnore = true)] public List OrderFlights { get; set; }
+ [SugarColumn(IsIgnore = true)]
+ public List OrderFlights { get; set; }
- [SugarColumn(IsIgnore = true)] public List OrderPullStatus { get; set; }
+ [SugarColumn(IsIgnore = true)]
+ public List OrderPullStatus { get; set; }
[Navigate(NavigateType.OneToMany, nameof(OrderPlatformNumberEntity.OrderId))]
- [SugarColumn(IsIgnore = true)] public List OrderPlatformNumbers { get; set; }
+ [SugarColumn(IsIgnore = true)]
+ public List OrderPlatformNumbers { get; set; }
public void ResetTrackInfo()
{
diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs
index b434e8b6..48eac8cb 100644
--- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs
+++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs
@@ -35,4 +35,6 @@ public interface ITrackDetailsEsRepository : IElasticsearchClientService> GetDataByIds(string[] ids);
Task GetDetailAsync(string orderNo, string trackCode, int orderType, int subSystemId, DateTime trackTime);
+
+ Task MigrateAsync();
}
diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs
index 02cb6b51..9cb1adec 100644
--- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs
+++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/TrackDetailsIndex.cs
@@ -125,8 +125,14 @@ public class TrackDetailsIndex : IdBaseIndex
///
/// 客户是否可见
///
+ [Obsolete("废弃的,请使用IsExternal")]
public bool IsVisibility { get; set; }
+ ///
+ /// 是否对外
+ ///
+ public bool IsExternal { get; set; }
+
///
/// 数据来源:1外部服务商创建,2内部系统创建,3人工创建
///
diff --git a/src/SJZY.Track.Domain/Dtos/TrackContents/TrackContentVO.cs b/src/SJZY.Track.Domain/Dtos/TrackContents/TrackContentVO.cs
index 374787e5..f9a126fb 100644
--- a/src/SJZY.Track.Domain/Dtos/TrackContents/TrackContentVO.cs
+++ b/src/SJZY.Track.Domain/Dtos/TrackContents/TrackContentVO.cs
@@ -67,6 +67,11 @@ public class TrackContentVO
///
public bool IsToMq { get; set; }
+ ///
+ /// 是否对外
+ ///
+ public bool IsExternal { get; set; }
+
///
/// 轨迹内容code
///
diff --git a/src/SJZY.Track.Repository/Queries/ProvideQueries.cs b/src/SJZY.Track.Repository/Queries/ProvideQueries.cs
index 3dc93cee..81d6703e 100644
--- a/src/SJZY.Track.Repository/Queries/ProvideQueries.cs
+++ b/src/SJZY.Track.Repository/Queries/ProvideQueries.cs
@@ -104,15 +104,18 @@ public class ProvideQueries : ISugarRepository, IProvideQueries, ITransientDepen
.Where(x => x.SubSystemId == subSystemId && x.Code == trackCode)
.Select((x, y, z, k) => new TrackContentVO
{
+ SubSystemId = x.SubSystemId,
SubSystemCode = z.Key,
TrackStatusId = x.TrackStatusId,
TrackStatus = y.Status,
TrackStatusCode = y.Code,
TrackContentCode = x.Code,
+ TrackContentId = x.Id,
TrackContent = x.Content,
TrackEnContent = x.EnContent,
IsCompleted = y.IsCompleted,
IsRepeatable = x.IsRepeatable,
+ IsExternal = x.IsExternal,
IsAllowManuallyUpdate = x.IsAllowManuallyUpdate,
IsAllowManuallyCreate = x.IsAllowManuallyCreate,
IsToMq = y.IsToMq || k.IsToMq,
@@ -135,10 +138,12 @@ public class ProvideQueries : ISugarRepository, IProvideQueries, ITransientDepen
TrackStatus = y.Status,
TrackStatusCode = y.Code,
TrackContentCode = x.Code,
+ TrackContentId = x.Id,
TrackContent = x.Content,
TrackEnContent = x.EnContent,
IsCompleted = y.IsCompleted,
IsRepeatable = x.IsRepeatable,
+ IsExternal = x.IsExternal,
IsAllowManuallyUpdate = x.IsAllowManuallyUpdate,
IsAllowManuallyCreate = x.IsAllowManuallyCreate,
IsToMq = y.IsToMq || k.IsToMq,
diff --git a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs
index b07a00ec..3e5bc514 100644
--- a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs
+++ b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs
@@ -11,12 +11,13 @@ namespace SJZY.Track.Repository.Repositories;
public class OrderRepository : BasicRepository, IOrderRepository, ITransientDependency
{
+ //tips:后期提供缓存清理接口
//MemoryCache本身线程安全简单使用,短暂数据不一致可以容忍,每过固定时间强制清除缓存
private static readonly MemoryCache _memoryCache = new(new MemoryCacheOptions());
private static readonly Dictionary _empty = new();
private static readonly Dictionary> _empty2 = new();
- private const int ThirdPartyOrderNumberCacheTimeSpan = 3 * 60;
- private const int MainDataEnumCacheTimeSpan = 5 * 60;
+ private static readonly TimeSpan _thirdPartyOrderNumberCacheTimeSpan = TimeSpan.FromMinutes(3);
+ private static readonly TimeSpan _mainDataEnumCacheTimeSpan = TimeSpan.FromMinutes(5);
private async Task> GetThirdPartyOrderNumberForCacheAsync(int[] orderIds)
{
@@ -48,7 +49,7 @@ public class OrderRepository : BasicRepository, IOrderRepository, I
_memoryCache.Set(key, dict, new MemoryCacheEntryOptions
{
- AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(ThirdPartyOrderNumberCacheTimeSpan),
+ AbsoluteExpirationRelativeToNow = _thirdPartyOrderNumberCacheTimeSpan,
Size = dict.Count
});
return dict;
@@ -92,7 +93,7 @@ public class OrderRepository : BasicRepository, IOrderRepository, I
_memoryCache.Set(key, dict, new MemoryCacheEntryOptions
{
- AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(MainDataEnumCacheTimeSpan),
+ AbsoluteExpirationRelativeToNow = _mainDataEnumCacheTimeSpan,
Size = dict.Count
});
return dict;
@@ -247,12 +248,12 @@ public class OrderRepository : BasicRepository, IOrderRepository, I
return pageList;
}
- public async Task<(int MainOrderId, int CustomId)> GetTrackOrderByProviderAndOrderNo(string serviceProvidrCode, string orderNo)
+ public async Task<(int MainOrderId, int CustomId)> GetTrackOrderByProviderAndOrderNo(string serviceProviderCode, string orderNo)
{
var orderList = await Context.Queryable()
.LeftJoin((a, b) => a.Id == b.OrderId && b.IsDeleted == false)
.Where((a, b) => a.OrderNo == orderNo
- || (b.Platform == serviceProvidrCode && b.OrderNumber == orderNo))
+ || (b.Platform == serviceProviderCode && b.OrderNumber == orderNo))
.Select((a, b) => new
{
a.Id,
@@ -269,7 +270,7 @@ public class OrderRepository : BasicRepository, IOrderRepository, I
var order = orderList.First();
//当出现了多条记录匹配,优先使用外部单匹配提升精确度
- var matchOrder = orderList.FirstOrDefault(x => x.Platform == serviceProvidrCode && x.OrderNumber == orderNo);
+ var matchOrder = orderList.FirstOrDefault(x => x.Platform == serviceProviderCode && x.OrderNumber == orderNo);
return matchOrder != null
? (matchOrder.Id, matchOrder.CustomId)
: (order.Id, order.CustomId);
diff --git a/src/SJZY.Track.Repository/Repositories/TrackContentRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackContentRepository.cs
index 7db9435d..2c49ff0e 100644
--- a/src/SJZY.Track.Repository/Repositories/TrackContentRepository.cs
+++ b/src/SJZY.Track.Repository/Repositories/TrackContentRepository.cs
@@ -270,6 +270,7 @@ public class TrackContentRepository : BasicRepository, ITrac
IsAllowManuallyUpdate = x.IsAllowManuallyUpdate,
IsAllowManuallyCreate = x.IsAllowManuallyCreate,
IsToMq = y.IsToMq,
+ IsExternal = x.IsExternal
}).ToListAsync();
}
}
diff --git a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs
index b9bf22af..46f97255 100644
--- a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs
+++ b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs
@@ -162,6 +162,7 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract(m => m
+ .AutoMap());
+ //字段迁移,isVisibility => isExternal
+ await Context.UpdateByQueryAsync(u => u
+ .Query(q => q.MatchAll())
+ .Script(s=>s.Source("ctx._source.isExternal = ctx._source.isVisibility"))
+ );
+ }
}