diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs
index eda7ecbc..dcafe452 100644
--- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs
+++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackOutput.cs
@@ -5,17 +5,18 @@ public class GetTrackOutput
///
/// 订单号
///
- public string OrderNo { get; set; }
+ public string OrderNo { get; set; } = null!;
- public List TrackDetails { get; set; }
+ public List TrackDetails { get; set; } = new();
}
public class TrackDetail
{
- public string Code { get; set; }
- public string Status { get; set; }
- public string Content { get; set; }
- public string Location { get; set; }
+ public string Code { get; set; } = null!;
+ public string Status { get; set; } = null!;
+ public string? Content { get; set; }
+ public string? OriginContent { get; set; }
+ public string Location { get; set; } = null!;
public DateTime Time { get; set; }
public float TimeZone { get; set; }
}
\ No newline at end of file
diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/EditTrackContentInput.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/EditTrackContentInput.cs
index d2a829ca..8a99f816 100644
--- a/src/SJZY.Track.Application.Contract/Dtos/TrackContents/EditTrackContentInput.cs
+++ b/src/SJZY.Track.Application.Contract/Dtos/TrackContents/EditTrackContentInput.cs
@@ -88,7 +88,7 @@
///
/// 轨迹标记id
///
- public int TrackFlagId { get; set; }
+ public int? TrackFlagId { get; set; }
///
/// 轨迹标记
diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackOrder/TrackPushRecordOutput.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackOrder/TrackPushRecordOutput.cs
new file mode 100644
index 00000000..bc136ca0
--- /dev/null
+++ b/src/SJZY.Track.Application.Contract/Dtos/TrackOrder/TrackPushRecordOutput.cs
@@ -0,0 +1,75 @@
+namespace SJZY.Track.Application.Contract.Dtos.TrackOrder;
+
+public class TrackPushRecordOutput
+{
+ ///
+ /// 订单Id
+ ///
+ public int OrderId { get; set; }
+
+ ///
+ /// 接口通请求Id
+ ///
+ public Guid RequestId { get; set; }
+
+ ///
+ /// 信息
+ ///
+ public string Message { get; set; } = null!;
+
+ ///
+ /// 操作类型
+ ///
+ public string OptionType { get; set; } = null!;
+
+ ///
+ /// 轨迹状态
+ ///
+ public string TrackStatus { get; set; } = null!;
+
+ ///
+ /// 轨迹内容代码
+ ///
+ public string TrackCode { get; set; } = null!;
+
+ ///
+ /// 轨迹内容
+ ///
+ public string TrackContent { get; set; } = null!;
+
+ ///
+ /// 轨迹发生地
+ ///
+ public string TrackPlace { get; set; } = null!;
+
+ ///
+ /// 轨迹发生时间
+ ///
+ public DateTime TrackTime { get; set; }
+
+ ///
+ /// 轨迹发生时区
+ ///
+ public float TrackTimeZone { get; set; }
+
+ ///
+ /// 轨迹发生时区
+ ///
+ public string TrackGTMTimeZone { get; set; } = null!;
+
+ ///
+ /// 是否成功
+ ///
+ public bool IsSuccess { get; set; }
+
+ ///
+ /// 推送内容(json)
+ ///
+ public string PushContent { get; set; } = null!;
+
+ /// 创建人
+ public string? CreateUser { get; set; }
+
+ /// 创建时间
+ public DateTime CreateTime { get; set; }
+}
\ No newline at end of file
diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushInput.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushInput.cs
new file mode 100644
index 00000000..7875d4da
--- /dev/null
+++ b/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushInput.cs
@@ -0,0 +1,20 @@
+namespace SJZY.Track.Application.Contract.Dtos.TrackPush;
+
+public class TrackPushInput
+{
+ public string OrderNo { get; set; } = null!;
+
+ public List Data { get; set; } = new();
+}
+
+public class TrackItem
+{
+ public string Location { get; set; } = null!;
+ public DateTime Date { get; set; }
+ public double TimeZone { get; set; }
+ public string? Description { get; set; }
+ public string? DescriptionCn { get; set; }
+ public string? Code { get; set; }
+ public string? Status { get; set; }
+ public string? Extra { get; set; }
+}
\ No newline at end of file
diff --git a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs
index 3533f2e6..53e0d856 100644
--- a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs
+++ b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs
@@ -22,6 +22,16 @@ public class TrackUpsertEvent
///
public string? ServiceProviderName { get; set; }
+ ///
+ /// 原轨迹内容
+ ///
+ public string? OriginTrackContent { get; set; }
+
+ ///
+ /// 原轨迹报文
+ ///
+ public string? OriginTrackData { get; set; }
+
///
/// 表示订单是否完成(只由轨迹刷新配置决定)
/// tips:能够使得IsCompleted为true的点,全局只有一个:轨迹刷新
diff --git a/src/SJZY.Track.Application.Contract/Services/ITrackPushCacheService.cs b/src/SJZY.Track.Application.Contract/Services/ITrackPushCacheService.cs
index d04c0fa2..8928ae11 100644
--- a/src/SJZY.Track.Application.Contract/Services/ITrackPushCacheService.cs
+++ b/src/SJZY.Track.Application.Contract/Services/ITrackPushCacheService.cs
@@ -12,6 +12,14 @@ public interface ITrackPushCacheService
///
Task?> GetPushContentConfigsAsync(int subSystemId, int customId);
+ ///
+ /// 设置服务商拉取配置缓存
+ ///
+ ///
+ ///
+ ///
+ Task?> SetPushContentConfigsAsync(int subSystemId, int customId);
+
///
/// 获取服务商拉取配置
///
@@ -33,14 +41,4 @@ public interface ITrackPushCacheService
Task IsValidPushAsync(int subSystemId, int customId,
string? latestPushTrackCode,
string? trackCode);
-
- ///
- /// 设置推送配置缓存
- ///
- ///
- /// 子系统id
- /// 客户id
- ///
- Task?> SetPushContentConfigsAsync(int? id = null, int? subSystemId = null,
- int? customId = null);
}
\ No newline at end of file
diff --git a/src/SJZY.Track.Application.Contract/Services/ITrackService.cs b/src/SJZY.Track.Application.Contract/Services/ITrackService.cs
index 31dae617..904f834d 100644
--- a/src/SJZY.Track.Application.Contract/Services/ITrackService.cs
+++ b/src/SJZY.Track.Application.Contract/Services/ITrackService.cs
@@ -31,5 +31,5 @@ public interface ITrackService : IRemoteService
///
///
///
- Task> QueryAsync(GetTrackInput input);
+ Task QueryAsync(GetTrackInput input);
}
\ No newline at end of file
diff --git a/src/SJZY.Track.Application/AutoMapper/OrderAutoMapperProfile.cs b/src/SJZY.Track.Application/AutoMapper/OrderAutoMapperProfile.cs
index 8befae94..dbe6b8f6 100644
--- a/src/SJZY.Track.Application/AutoMapper/OrderAutoMapperProfile.cs
+++ b/src/SJZY.Track.Application/AutoMapper/OrderAutoMapperProfile.cs
@@ -1,8 +1,10 @@
using AutoMapper;
using SJZY.Expand.ABP.Core.PublicMethords;
using SJZY.Track.Application.Contract.Dtos.ProvideServices;
+using SJZY.Track.Application.Contract.Dtos.TrackOrder;
using SJZY.Track.Domain.Aggregates.OrderAggregate;
using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
+using SJZY.Track.Domain.Aggregates.TrackPushAggregate;
using SJZY.Track.Domain.Dtos.Order;
using SJZY.Track.Domain.Enums;
using Volo.Abp.AutoMapper;
@@ -34,6 +36,8 @@ public class OrderAutoMapperProfile : Profile
.ForMember(dest => dest.Content, opt => opt.MapFrom(m => m.TrackContent))
.ForMember(dest => dest.EnContent, opt => opt.MapFrom(m => m.TrackEnContent))
.ForMember(dest => dest.TrackTimeZoneValue, opt => opt.MapFrom(m => m.TrackTimeZone));
+
+ CreateMap(MemberList.None);
}
///
diff --git a/src/SJZY.Track.Application/EventHandlers/CAPFilter.cs b/src/SJZY.Track.Application/EventHandlers/CAPFilter.cs
index d6186324..06bdeca3 100644
--- a/src/SJZY.Track.Application/EventHandlers/CAPFilter.cs
+++ b/src/SJZY.Track.Application/EventHandlers/CAPFilter.cs
@@ -20,8 +20,9 @@ public class CapFilter : SubscribeFilter
{
context.DeliverMessage.Headers["sjzy-receive-time"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff");
- // 轨迹刷新不做幂等
- if (context.DeliverMessage.Headers["cap-msg-name"]!.EndsWith(GlobalConst.TrackRefreshSubscribe))
+ // 轨迹增删改要做幂等
+ if (!context.DeliverMessage.Headers["cap-msg-name"]
+ .IsIn(GlobalConst.TrackUpsertSubscribe, GlobalConst.TrackDeleteSubscribe))
return Task.CompletedTask;
// 本地调试不做幂等
diff --git a/src/SJZY.Track.Application/EventHandlers/OrderLinkAfterFillTrackHandler.cs b/src/SJZY.Track.Application/EventHandlers/OrderLinkAfterFillTrackHandler.cs
index 2d8a0ef5..37daa472 100644
--- a/src/SJZY.Track.Application/EventHandlers/OrderLinkAfterFillTrackHandler.cs
+++ b/src/SJZY.Track.Application/EventHandlers/OrderLinkAfterFillTrackHandler.cs
@@ -1,6 +1,5 @@
using DotNetCore.CAP;
using SJZY.Track.Application.Contract.Events;
-using SJZY.Track.Domain.Aggregates.OrderAggregate;
using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
using SJZY.Track.Domain.Consts;
using Volo.Abp.DependencyInjection;
@@ -11,14 +10,11 @@ public class OrderLinkAfterFillTrackHandler : ITransientDependency, ICapSubscrib
{
private readonly ITrackDetailsRepository _trackDetailsRepository;
private readonly ICapPublisher _capPublisher;
- private readonly IOrderRepository _orderRepository;
- public OrderLinkAfterFillTrackHandler(ITrackDetailsRepository trackDetailsRepository, ICapPublisher capPublisher,
- IOrderRepository orderRepository)
+ public OrderLinkAfterFillTrackHandler(ITrackDetailsRepository trackDetailsRepository, ICapPublisher capPublisher)
{
_trackDetailsRepository = trackDetailsRepository;
_capPublisher = capPublisher;
- _orderRepository = orderRepository;
}
[CapSubscribe(GlobalConst.OrderLinkAfterFillTrack)]
diff --git a/src/SJZY.Track.Application/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackPushEventHandler.cs
index e95906da..a9a207e9 100644
--- a/src/SJZY.Track.Application/EventHandlers/TrackPushEventHandler.cs
+++ b/src/SJZY.Track.Application/EventHandlers/TrackPushEventHandler.cs
@@ -1,5 +1,5 @@
using DotNetCore.CAP;
-using Newtonsoft.Json.Linq;
+using Newtonsoft.Json;
using SJZY.Expand.ABP.Core.PublicMethords;
using SJZY.InterfaceRelay.Application.Contracts;
using SJZY.Track.Application.Contract.Dtos.TrackPush;
@@ -39,9 +39,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
{
x.SubSystemId, x.LatestPushTrackCode, x.QuestionType, x.CustomId
});
- if (order == null || order.QuestionType == (int)TrackProblemType.Error) return; // 是否通知?
-
- TrackPushContentConfigDto? config;
+ if (order == null) return;
var log = new TrackPushRecordIndex
{
@@ -58,6 +56,8 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
CreateTime = DateTime.Now
};
+ TrackPushContentConfigDto? config = null;
+
switch (@event.OptionType)
{
case OptionType.无:
@@ -65,9 +65,16 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
case OptionType.新增:
if (@event.OperationMan == null)
{
- // 推送新增,需要根据上一次的推送 推断 本次推送 是否可行
- config = await _trackPushCacheService.IsValidPushAsync(order.SubSystemId, order.CustomId,
- order.LatestPushTrackCode, @event.TrackCode);
+ if (order.QuestionType != (int)TrackProblemType.Error)
+ {
+ // 推送新增,需要根据上一次的推送 推断 本次推送 是否可行
+ config = await _trackPushCacheService.IsValidPushAsync(order.SubSystemId, order.CustomId,
+ order.LatestPushTrackCode, @event.TrackCode);
+ if (config is not { IsAutoPush: true })
+ {
+ config = null;
+ }
+ }
}
else
{
@@ -132,45 +139,50 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
// tips:只有新增会影响推送进度?
order.LatestPushTrackCode = dto.TrackCode;
order.LatestPushTime = DateTime.Now;
+ await _orderRepository.UpdateColumnAsync(order, x => new
+ {
+ x.LatestPushTrackCode, x.LatestPushTime, x.QuestionType, x.LatestPushError
+ });
+ return;
}
}
await _orderRepository.UpdateColumnAsync(order, x => new
{
- x.LatestPushTrackCode, x.QuestionType, x.LatestPushError, x.LatestPushTime
+ x.QuestionType, x.LatestPushError
});
}
private async Task DoAddAsync(TrackPushEvent @event,
TrackPushContentConfigDto config, TrackPushRecordIndex log)
{
- var track = new
+ var track = new TrackItem
{
// 推真实的发生地和发生时间(时间是计算后的)
- location = @event.TrackPlace,
- date = @event.TrackTime.AddHours(
+ Location = @event.TrackPlace,
+ Date = @event.TrackTime.AddHours(
config.TrackTimeZone ?? @event.TrackTimeZone - @event.TrackTimeZone),
- timeZone = config.TrackTimeZone ?? @event.TrackTimeZone,
- description = config.TrackEnContentValue,
- description_cn = config.TrackContentValue,
- code = config.TrackContentCodeValue,
- status = config.TrackStatusValue,
- extra = config.ExpandFieldsValue
+ TimeZone = config.TrackTimeZone ?? @event.TrackTimeZone,
+ Description = config.TrackEnContentValue,
+ DescriptionCn = config.TrackContentValue,
+ Code = config.TrackContentCodeValue,
+ Status = config.TrackStatusValue,
+ Extra = config.ExpandFieldsValue
};
- JObject body = JObject.FromObject(new
+ var body = new TrackPushInput()
{
- orderNo = @event.OrderNo,
- data = new[] { track }
- });
+ OrderNo = @event.OrderNo,
+ };
+ body.Data.Add(track);
if (config.IsAllPush)
{
var history = await _trackPushRecordsRepository.GetLatestTrackPushRecordAsync(@event.OrderId);
if (history != default)
{
- body = JObject.Parse(history.PushContent);
- ((JArray)body["data"]!).Add(JObject.FromObject(track));
+ body = JsonConvert.DeserializeObject(history.PushContent);
+ body!.Data.Add(track);
}
}
@@ -178,6 +190,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
config.ServiceProviderCode, body);
log.PushContent = body.ToJson();
+
log.IsSuccess = res.Code == InterfaceRelayConst.SuccessCode;
log.RequestId = res.RequestId;
log.Message = res.Msg;
diff --git a/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs
index b4bfe207..61431b30 100644
--- a/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs
+++ b/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs
@@ -218,6 +218,7 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe
OrderType = context.OrderType,
OrderNo = context.OrderNo,
ServiceProviderName = context.ServiceProviderName,
+ OriginTrackData = JsonConvert.SerializeObject(trackToken),
IsCompleted = matchedContentConfig.IsCompleted,
SubSystemId = context.SubSystemId,
TrackCode = matchedContentConfig.TrackContentCode,
@@ -225,6 +226,11 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe
TrackTime = trackTime ?? DateTime.Now,
TrackTimeZone = trackTimeZone ?? matchedContentConfig.TrackTimeZoneValue ?? 8
};
+ if (paramConfig.TrackContentName != null)
+ {
+ trackUpsertEvent.OriginTrackContent = trackToken[paramConfig.TrackContentName]?.Value();
+ }
+
await _capPublisher.PublishAsync(GlobalConst.TrackUpsertSubscribe, trackUpsertEvent);
}
}
\ No newline at end of file
diff --git a/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs
index 41ce263b..105ef588 100644
--- a/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs
+++ b/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs
@@ -131,6 +131,8 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
TrackTime = @event.TrackTime,
TrackTimeZone = @event.TrackTimeZone,
ServiceProviderName = @event.ServiceProviderName,
+ OriginTrackContent = @event.OriginTrackContent,
+ OriginTrackData = @event.OriginTrackData,
IsCanDelete = false,
CreateUser = @event.OperationMan ?? GlobalConst.SystemUser,
CreateTime = DateTime.Now
diff --git a/src/SJZY.Track.Application/SJZY.Track.Application.csproj b/src/SJZY.Track.Application/SJZY.Track.Application.csproj
index 172e83f5..99912fb3 100644
--- a/src/SJZY.Track.Application/SJZY.Track.Application.csproj
+++ b/src/SJZY.Track.Application/SJZY.Track.Application.csproj
@@ -12,7 +12,7 @@
-
+
diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackPullService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackPullService.cs
index d7b0bc94..7cf315b2 100644
--- a/src/SJZY.Track.Application/Services/ProvideServices/TrackPullService.cs
+++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackPullService.cs
@@ -64,7 +64,7 @@ public class TrackPullService : ApplicationService
var attach = Base64Helper.SerializeObject(group.Key);
// 批量获取轨迹
- await _httpClientProxy.Service.BatchForwardThenPushToQueueAsync(
+ var _ = await _httpClientProxy.Service.BatchForwardThenPushToQueueAsync(
"A012", serviceProviderCode, data, GlobalConst.TrackRefreshSubscribe, attach);
}
diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs
index 35237196..74f4e52f 100644
--- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs
+++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs
@@ -17,7 +17,7 @@ public partial class TrackService
///
///
[HttpPost("Track/Query")]
- public async Task> QueryAsync(GetTrackInput input)
+ public async Task QueryAsync(GetTrackInput input)
{
if (input.OrderNos.Count > 500)
{
@@ -39,6 +39,7 @@ public partial class TrackService
Code = x.TrackCode,
Status = x.TrackStatus,
Content = x.TrackContent,
+ OriginContent = x.OriginTrackContent,
Location = x.TrackPlace,
Time = x.TrackTime.AddHours(input.TimeZone ?? 8 - x.TrackTimeZone),
TimeZone = input.TimeZone ?? 8
@@ -49,11 +50,34 @@ public partial class TrackService
await TrackDetailSort(res, input);
- return res;
+ return new UnifyResultDto(true, res, "操作成功");
}
private async Task TrackDetailSort(List list, GetTrackInput input)
{
+ var orderTemplates = await _provideQueries
+ .GetOrderTemplateLinksAsync(input.OrderType, input.OrderNos);
+ var distinctTemplateIds = orderTemplates.Select(x => x.TemplateId).Distinct().ToList();
+ var templateContent = await _provideQueries.GetOrderedTrackCodesAsync(distinctTemplateIds);
+
+ list.ForEach(item =>
+ {
+ var codes = new List();
+ // 多模板拼接显示
+ foreach (var orderTemplate in orderTemplates.Where(x => x.OrderNo == item.OrderNo))
+ {
+ codes.AddRange(templateContent
+ .Where(t => t.TemplateId == orderTemplate.TemplateId) // 按模板
+ .Where(t => t.IsExternal) // 过滤不对外的
+ .Select(t => t.Code));
+ }
+
+ item.TrackDetails = item.TrackDetails
+ .Where(x => codes.Contains(x.Code)) // 剔除不在模板内容中的元素
+ .OrderBy(x => codes.IndexOf(x.Code)) // 按照在模板内容的位置排序
+ .ToList();
+ });
+
switch (input.SortMethod)
{
case SortMethod.ByTrackTime:
@@ -64,30 +88,21 @@ public partial class TrackService
list.ForEach(item => item.TrackDetails.Sort((a, b) => b.Time.CompareTo(a.Time)));
break;
case SortMethod.ByTemplate:
- var orderTemplates = await _provideQueries
- .GetOrderTemplateLinksAsync(input.OrderType, input.OrderNos);
- var distinctTemplateIds = orderTemplates.Select(x => x.TemplateId).Distinct().ToList();
- var templateContent = await _provideQueries.GetOrderedTrackCodesAsync(distinctTemplateIds);
- list.ForEach(item =>
- {
- var codes = new List();
- // 多模板拼接显示
- foreach (var orderTemplate in orderTemplates.Where(x => x.OrderNo == item.OrderNo))
- {
- codes.AddRange(templateContent
- .Where(t => t.TemplateId == orderTemplate.TemplateId) // 按模板
- .Where(t => t.IsExternal) // 过滤不对外的
- .Select(t => t.Code));
- }
-
- item.TrackDetails = item.TrackDetails
- .Where(x => codes.Contains(x.Code)) // 剔除不在模板内容中的元素
- .OrderBy(x => codes.IndexOf(x.Code)) // 按照在模板内容的位置排序
- .ToList();
- });
break;
default:
throw new ArgumentOutOfRangeException(nameof(input.SortMethod), input.SortMethod, "不支持的排序方式");
}
+
+ // 显示原轨迹
+ list.ForEach(item =>
+ {
+ item.TrackDetails.ForEach(track =>
+ {
+ if (templateContent.First(x => x.Code == track.Code).ShowOrigin)
+ {
+ track.Content = track.OriginContent;
+ }
+ });
+ });
}
}
\ No newline at end of file
diff --git a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs
index 657cc671..9ed8374e 100644
--- a/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs
+++ b/src/SJZY.Track.Application/Services/TrackContents/TrackContentService.cs
@@ -59,6 +59,8 @@ public class TrackContentService : ApplicationService
}
var dto = ObjectMapper.Map(detailInfo);
+
+ if (dto.TrackFlagId == 0) dto.TrackFlagId = null;
return new UnifyResultDto("200", "", dto);
}
diff --git a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs
index 5f3c1179..477456cb 100644
--- a/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs
+++ b/src/SJZY.Track.Application/Services/TrackOrders/TrackOrderService.cs
@@ -160,8 +160,20 @@ public class TrackOrderService : ApplicationService
///
/// 订单id
[HttpGet("GetTrackPushRecords")]
- public async Task> GetTrackPushRecordsAsync(int orderId)
+ public async Task> GetTrackPushRecordsAsync(int orderId)
{
- return await _trackPushRecordsRepository.GetTrackPushRecordsAsync(orderId);
+ var records = await _trackPushRecordsRepository.GetTrackPushRecordsAsync(orderId);
+
+ var res = ObjectMapper.Map, List>(records);
+
+ res.ForEach(x =>
+ {
+ int hours = (int)x.TrackTimeZone; // 提取整数部分作为小时
+ int minutes = (int)((x.TrackTimeZone - hours) * 60); // 将小数部分乘以 60 转换为分钟
+ x.TrackGTMTimeZone =
+ $"GTM {(x.TrackTimeZone >= 0 ? "+" : "-")}{new TimeSpan(hours, minutes, 0).ToString().RemovePostFix(":00")}";
+ });
+
+ return res;
}
}
\ No newline at end of file
diff --git a/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs b/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs
index 88d6b079..e5d413f4 100644
--- a/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs
+++ b/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs
@@ -1,5 +1,4 @@
-using System.Linq.Expressions;
-using SJZY.Expand.ABP.Core;
+using SJZY.Expand.ABP.Core;
using SJZY.Track.Application.Contract.Dtos.TrackPush;
using SJZY.Track.Application.Contract.Services;
using SJZY.Track.Domain.Aggregates.TrackPushAggregate;
@@ -22,11 +21,25 @@ public class TrackPushCacheService : ITrackPushCacheService, ITransientDependenc
public async Task?> GetPushContentConfigsAsync(int subSystemId, int customId)
{
- var data = await RedisHelper.Client.GetAsync>(
- TrackPushContentKey(subSystemId, customId));
+ var exists = await RedisHelper.Client.ExistsAsync(TrackPushContentKey(subSystemId, customId));
+ if (exists)
+ {
+ return await RedisHelper.Client.GetAsync>(
+ TrackPushContentKey(subSystemId, customId));
+ }
- data ??= await SetPushContentConfigsAsync(subSystemId: subSystemId, customId: customId);
+ return await SetPushContentConfigsAsync(subSystemId, customId);
+ }
+ public async Task?> SetPushContentConfigsAsync(int subSystemId, int customId)
+ {
+ // maybe is null
+ var data = await DoGetPushContentConfigsAsync(subSystemId, customId);
+ var ttl = 3 * 24 * 60 * 60;
+ if (data == null) ttl = 5;
+ // ttl 3days
+ await RedisHelper.Client.SetAsync(TrackPushContentKey(subSystemId, customId),
+ data, ttl);
return data;
}
@@ -55,26 +68,26 @@ public class TrackPushCacheService : ITrackPushCacheService, ITransientDependenc
// find swap
cache.FirstOrDefault(x => x.TrackCode == cache[idx + 1].SwapTrackCode);
- return matched != null && matched.TrackCode == trackCode && matched.IsAutoPush ? matched : default;
+ return matched != null && matched.TrackCode == trackCode ? matched : default;
}
- public async Task?> SetPushContentConfigsAsync(int? id = null,
- int? subSystemId = null,
- int? customId = null)
+ private async Task?> DoGetPushContentConfigsAsync(int subSystemId, int customId)
{
- Expression> exp = x => true;
- if (id.HasValue) exp = x => x.Id == id;
- else if (subSystemId.HasValue && customId.HasValue)
- exp = x => x.SubSystemId == subSystemId && x.CustomId == customId;
-
- var trackPushConfig = await _trackPushConfigRepository.GetFirstAsync(exp, x => new
+ var trackPushConfig = await _trackPushConfigRepository.GetFirstAsync(
+ x => x.SubSystemId == subSystemId && x.CustomId == customId, x => new
+ {
+ x.Id, x.IsAutoPush, x.IsAllPush, x.IsCanDelete, x.IsCanUpdate, x.SubSystemId, x.CustomId
+ });
+ if (trackPushConfig == null)
{
- x.Id, x.IsAutoPush, x.IsAllPush, x.IsCanDelete, x.IsCanUpdate, x.SubSystemId, x.CustomId
- });
- if (trackPushConfig == null) return null;
+ return null;
+ }
var trackPushContentList = await _trackPushConfigRepository.GetContentListAsync(trackPushConfig.Id);
- if (trackPushContentList.Count == 0) return null;
+ if (trackPushContentList.Count == 0)
+ {
+ return null;
+ }
// tips:hot path,auto mapper性能不如原生
var res = trackPushContentList.Select(item => new TrackPushContentConfigDto
@@ -95,9 +108,6 @@ public class TrackPushCacheService : ITrackPushCacheService, ITransientDependenc
ExpandFieldsValue = item.ExpandFieldsValue,
}).ToList();
- await RedisHelper.Client.SetAsync(TrackPushContentKey(trackPushConfig.SubSystemId, trackPushConfig.CustomId),
- res);
-
return res;
}
}
\ No newline at end of file
diff --git a/src/SJZY.Track.Application/Services/TrackPush/TrackPushService.cs b/src/SJZY.Track.Application/Services/TrackPush/TrackPushService.cs
index 5225e8db..f7d69e1d 100644
--- a/src/SJZY.Track.Application/Services/TrackPush/TrackPushService.cs
+++ b/src/SJZY.Track.Application/Services/TrackPush/TrackPushService.cs
@@ -95,12 +95,17 @@ public class TrackPushService : ApplicationService
throw new BusinessException(message: _stringLocalizer["IsTrackPushConfigAny"]);
}
+ using var ts = TransactionScopeHelper.Create();
+
switch (input.Options)
{
case OptionTypeNoNull.新增:
{
var trackPushEntity = ObjectMapper.Map(input);
+
await _trackPushConfigRepository.InsertReturnIdentityAsync(trackPushEntity);
+ await _trackPushCacheService.SetPushContentConfigsAsync(trackPushEntity.SubSystemId,
+ trackPushEntity.CustomId);
}
break;
@@ -111,21 +116,19 @@ public class TrackPushService : ApplicationService
ObjectMapper.Map(input, oldTrackPushEntity);
await _trackPushConfigRepository.UpdateAsync(oldTrackPushEntity);
-
- if (input.IsAutoPush!.Value) await _trackPushCacheService.SetPushContentConfigsAsync(input.Id);
+ await _trackPushCacheService.SetPushContentConfigsAsync(oldTrackPushEntity.SubSystemId,
+ oldTrackPushEntity.CustomId);
}
break;
case OptionTypeNoNull.删除:
{
- _ = await _trackPushConfigRepository.GetFirstAsync(x => x.Id == input.Id) ??
- throw new BusinessException(message: _stringLocalizer["NotFindData"]);
+ var entity = await _trackPushConfigRepository.GetFirstAsync(x => x.Id == input.Id) ??
+ throw new BusinessException(message: _stringLocalizer["NotFindData"]);
- using var ts = TransactionScopeHelper.Create();
await _trackPushConfigRepository.SoftDeleteAsync(x => x.Id == input.Id);
await _trackPushConfigRepository.SoftDeleteContentAsync(x => x.TrackPushConfigId == input.Id);
-
- ts.Complete();
+ await _trackPushCacheService.SetPushContentConfigsAsync(entity.SubSystemId, entity.CustomId);
}
break;
@@ -134,6 +137,7 @@ public class TrackPushService : ApplicationService
nameof(EditTrackPushConfigInput.Options)]);
}
+ ts.Complete();
return true;
}
@@ -172,6 +176,10 @@ public class TrackPushService : ApplicationService
throw new BusinessException(message: _stringLocalizer["IsTrackPushEnContentValueAny"]);
}
+ var trackPushConfigId = input.TrackPushConfigId;
+
+ using var ts = TransactionScopeHelper.Create();
+
switch (input.Options)
{
case OptionTypeNoNull.新增:
@@ -181,10 +189,7 @@ public class TrackPushService : ApplicationService
var entity = ObjectMapper.Map(input);
entity.Sort = maxSort + 1;
-
await _trackPushConfigRepository.InsertContentAsync(entity);
- await _trackPushCacheService.SetPushContentConfigsAsync(input.TrackPushConfigId);
-
break;
}
@@ -194,10 +199,7 @@ public class TrackPushService : ApplicationService
throw new BusinessException(message: _stringLocalizer["NotFindData"]);
ObjectMapper.Map(input, entity);
-
await _trackPushConfigRepository.UpdateContentAsync(entity);
- await _trackPushCacheService.SetPushContentConfigsAsync(entity.TrackPushConfigId);
-
break;
}
@@ -205,18 +207,10 @@ public class TrackPushService : ApplicationService
{
var entity = await _trackPushConfigRepository.GetContentByIdAsync(input.Id!.Value) ??
throw new BusinessException(message: _stringLocalizer["NotFindData"]);
-
- using (var ts = TransactionScopeHelper.Create())
- {
- await _trackPushConfigRepository.SoftDeleteContentAsync(x => x.Id == input.Id);
- await _trackPushConfigRepository.UpdateContentAsync(x => x.Sort == x.Sort - 1,
- x => x.TrackPushConfigId == entity.TrackPushConfigId && x.Sort > entity.Sort);
-
- ts.Complete();
- }
-
- await _trackPushCacheService.SetPushContentConfigsAsync(entity.TrackPushConfigId);
-
+ trackPushConfigId = entity.TrackPushConfigId;
+ await _trackPushConfigRepository.SoftDeleteContentAsync(x => x.Id == input.Id);
+ await _trackPushConfigRepository.UpdateContentAsync(x => x.Sort == x.Sort - 1,
+ x => x.TrackPushConfigId == entity.TrackPushConfigId && x.Sort > entity.Sort);
break;
}
@@ -225,6 +219,14 @@ public class TrackPushService : ApplicationService
nameof(EditTrackPushContentInput.Options)]);
}
+ var pushConfig = await _trackPushConfigRepository.GetFirstAsync(x => x.Id == trackPushConfigId);
+ if (pushConfig != null)
+ {
+ await _trackPushCacheService.SetPushContentConfigsAsync(pushConfig.SubSystemId, pushConfig.CustomId);
+ }
+
+ ts.Complete();
+
return true;
}
@@ -247,8 +249,19 @@ public class TrackPushService : ApplicationService
if (trackPushContentEntities.Count > 0)
{
+ using var ts = TransactionScopeHelper.Create();
+
await _trackPushConfigRepository.UpdateContentRangeAsync(trackPushContentEntities);
- await _trackPushCacheService.SetPushContentConfigsAsync(trackPushContentEntities[0].TrackPushConfigId);
+
+ var pushConfig =
+ await _trackPushConfigRepository.GetFirstAsync(x =>
+ x.Id == trackPushContentEntities[0].TrackPushConfigId);
+ if (pushConfig != null)
+ {
+ await _trackPushCacheService.SetPushContentConfigsAsync(pushConfig.SubSystemId, pushConfig.CustomId);
+ }
+
+ ts.Complete();
}
return true;
diff --git a/src/SJZY.Track.Application/Services/TrackTemplates/ITrackTemplateService.cs b/src/SJZY.Track.Application/Services/TrackTemplates/ITrackTemplateService.cs
deleted file mode 100644
index f6e29107..00000000
--- a/src/SJZY.Track.Application/Services/TrackTemplates/ITrackTemplateService.cs
+++ /dev/null
@@ -1,7 +0,0 @@
-namespace SJZY.Track.Application.Services.TrackTemplates
-{
- public interface ITrackTemplateService
- {
-
- }
-}
diff --git a/src/SJZY.Track.Domain/Dtos/TrackTemplate/OrderedTrackCodeDto.cs b/src/SJZY.Track.Domain/Dtos/TrackTemplate/OrderedTrackCodeDto.cs
index cb31744d..43805324 100644
--- a/src/SJZY.Track.Domain/Dtos/TrackTemplate/OrderedTrackCodeDto.cs
+++ b/src/SJZY.Track.Domain/Dtos/TrackTemplate/OrderedTrackCodeDto.cs
@@ -16,4 +16,9 @@ public class OrderedTrackCodeDto
/// 是否对外
///
public bool IsExternal { get; set; }
+
+ ///
+ /// 显示原轨迹
+ ///
+ public bool ShowOrigin { get; set; }
}
\ No newline at end of file
diff --git a/src/SJZY.Track.Repository/Queries/ProvideQueries.cs b/src/SJZY.Track.Repository/Queries/ProvideQueries.cs
index cce3c885..7f144688 100644
--- a/src/SJZY.Track.Repository/Queries/ProvideQueries.cs
+++ b/src/SJZY.Track.Repository/Queries/ProvideQueries.cs
@@ -20,20 +20,6 @@ public class ProvideQueries : ISugarRepository, IProvideQueries,
Context = SqlsugarScopeBasic.GetContextSafely("default");
}
- public async Task> GetOrderTemplateLinksAsync(int orderType,
- params string[] orderNumbers)
- {
- return await Context.Queryable()
- .LeftJoin((a, b) => a.Id == b.OrderId)
- .Where(a => a.OrderType == orderType && orderNumbers.Contains(a.OrderNo))
- .Select((a, b) => new OrderTemplateLinkDto
- {
- OrderNo = a.OrderNo,
- TemplateId = b.TrackTemplateId
- })
- .ToListAsync();
- }
-
public async Task> GetOrderTemplateLinksAsync(int orderType, List orderNumbers)
{
return await Context.Queryable()
@@ -49,15 +35,17 @@ public class ProvideQueries : ISugarRepository, IProvideQueries,
public async Task> GetOrderedTrackCodesAsync(List templateIds)
{
- return await Context.Queryable()
- .LeftJoin((a, b) => a.TrackContentId == b.Id)
- .Where(a => templateIds.Contains(a.TrackTemplateId))
- .OrderBy(a => a.Sort)
- .Select((a, b) => new OrderedTrackCodeDto
+ return await Context.Queryable()
+ .LeftJoin((a, b) => a.Id == b.TrackTemplateId)
+ .LeftJoin((a, b, c) => b.TrackContentId == c.Id)
+ .Where(a => templateIds.Contains(a.Id))
+ .OrderBy((a, b) => b.Sort)
+ .Select((a, b, c) => new OrderedTrackCodeDto
{
- TemplateId = a.TrackTemplateId,
- Code = b.Code,
- IsExternal = a.IsExternal
+ TemplateId = a.Id,
+ ShowOrigin = a.ShowOrigin,
+ Code = c.Code,
+ IsExternal = b.IsExternal
})
.ToListAsync();
}
diff --git a/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs
index 1229eec7..03b3c7c9 100644
--- a/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs
+++ b/src/SJZY.Track.Repository/Repositories/TrackDetailsRepository.cs
@@ -85,6 +85,7 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract f.TrackStatus)
.Field(f => f.TrackCode)
.Field(f => f.TrackContent)
+ .Field(f => f.OriginTrackContent)
.Field(f => f.TrackPlace)
.Field(f => f.TrackTime)
.Field(f => f.TrackTimeZone)