新增获取可用轨迹内容接口

This commit is contained in:
eli 2024-11-13 10:26:20 +08:00
parent 07663e2ab0
commit 895238782d
14 changed files with 420 additions and 6 deletions

View File

@ -7,7 +7,7 @@
"Apollo": {
"AppId": "SJZY.Track.Configuration",
"Env": "DEV",
"Namespace": "test",
"Namespace": "dev",
"MetaServer": "http://apollo-service-test-apollo-configservice.apollo.svc.cluster.local:8080",
"ConfigServer": [
"http://apollo-service-test-apollo-configservice.apollo.svc.cluster.local:8080"

View File

@ -0,0 +1,19 @@
namespace SJZY.Track.Application.Contract.Dtos.ProvideServices;
public class GetDetailTimelineInput
{
/// <summary>
/// 订单编号
/// </summary>
public string OrderNumber { get; set; }
/// <summary>
/// 子系统id
/// </summary>
public int SystemId{ get; set; }
/// <summary>
/// 是否客户端,false时展示所有轨迹,true时只展示对外的轨迹
/// </summary>
public bool IsCustomeClient { get; set; }
}

View File

@ -0,0 +1,54 @@
namespace SJZY.Track.Application.Contract.Dtos.ProvideServices;
public class GetDetailTimelineOutput
{
/// <summary>
/// 轨迹编码
/// </summary>
public string TrackCode { get; set; }
/// <summary>
/// 轨迹内容
/// </summary>
public string Content { get; set; }
/// <summary>
/// 轨迹英文内容
/// </summary>
public string EnContent { get; set; }
/// <summary>
/// 轨迹发生地
/// </summary>
public string TrackPlace { get; set; } = null!;
/// <summary>
/// 轨迹发生时间
/// </summary>
public long TrackTime { get; set; }
/// <summary>
/// 轨迹时间前缀
/// </summary>
public string TrackTimePrefix { get; set; }
/// <summary>
/// 轨迹发生时区
/// </summary>
public string TrackTimeZone { get; set; }
/// <summary>
/// 备注
/// </summary>
public string Remark { get; set; }
/// <summary>
/// 文件 osskey 集合
/// </summary>
public List<string> Files { get; set; }
/// <summary>
/// 是否高亮
/// </summary>
public bool IsHighlight { get; set; }
}

View File

@ -46,6 +46,26 @@ public class EditTrackContentInput
/// 是否对外
/// </summary>
public bool IsExternal { get; set; }
/// <summary>
/// 是否可重复
/// </summary>
public bool IsRepeatable { get; set; }
/// <summary>
/// 是否允许手动修改
/// </summary>
public bool IsAllowManuallyUpdate { get; set; }
/// <summary>
/// 是否允许手动创建
/// </summary>
public bool IsAllowManuallyCreate { get; set; }
/// <summary>
/// 是否同步轨迹订单上的预计到达时间
/// </summary>
public bool IsChangeOrderEdd { get; set; }
}
public class GetTrackContentDetailDto

View File

@ -0,0 +1,25 @@
namespace SJZY.Track.Application.Contract.Dtos.TrackContents;
public class GetAvailableContentInput
{
/// <summary>
/// 子系统id
/// </summary>
public int SystemId { get; set; }
/// <summary>
/// 订单号
/// </summary>
public string? OrderNo { get; set; }
/// <summary>
/// 操作类型 1=创建 2=修改
/// </summary>
public TrackOptionType TrackOptionType { get; set; }
}
public enum TrackOptionType
{
创建 = 1,
修改 = 2
}

View File

@ -0,0 +1,29 @@
namespace SJZY.Track.Application.Contract.Dtos.TrackContents;
public class GetAvailableContentOutput
{
/// <summary>
/// Id
/// </summary>
public int Id { get; set; }
/// <summary>
/// 轨迹内容代码
/// </summary>
public string Code { get; set; }
/// <summary>
/// 轨迹内容
/// </summary>
public string Content { get; set; }
/// <summary>
/// 轨迹内容英文
/// </summary>
public string EnContent { get; set; }
/// <summary>
/// 是否对外
/// </summary>
public bool IsExternal { get; set; }
}

View File

@ -0,0 +1,14 @@
namespace SJZY.Track.Application.Contract.Dtos.TrackContents;
public class GetTrackContentByCodeInput
{
/// <summary>
/// 子系统id
/// </summary>
public int SystemId { get; set; }
/// <summary>
/// 轨迹内容code
/// </summary>
public string Code { get; set; }
}

View File

@ -0,0 +1,19 @@
namespace SJZY.Track.Application.Contract.Dtos.TrackContents;
public class GetTrackContentByCodeOutput
{
/// <summary>
/// 中文内容
/// </summary>
public string Content { get; set; }
/// <summary>
/// 英文内容
/// </summary>
public string EnContent { get; set; }
/// <summary>
/// 是否对外
/// </summary>
public bool IsExternal { get; set; }
}

View File

@ -2,9 +2,12 @@ using System.Linq.Expressions;
using Microsoft.Extensions.Localization;
using SJZY.Expand.ABP.Core.Localization;
using SJZY.Expand.ABP.Core.PublicMethords;
using SJZY.Track.Application.Contract.Dtos.ProvideServices;
using SJZY.Track.Application.Contract.Dtos.TrackContents;
using SJZY.Track.Application.Localization;
using SJZY.Track.Domain.Aggregates.OrderAggregate;
using SJZY.Track.Domain.Aggregates.TrackContentAggregate;
using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
using SJZY.Track.Domain.Aggregates.TrackFlagAggregate;
using SJZY.Track.Domain.Aggregates.TrackStatusAggregate;
using SJZY.Track.Domain.Dtos.TrackContents;
@ -23,17 +26,23 @@ public class TrackContentService : ApplicationService
private readonly ITrackContentRepository _trackContentRepository;
private readonly IBasicQuery<TrackFlagEntity> _trackFlagBasicQuery;
private readonly IBasicQuery<TrackStatusEntity> _trackStatusBasicQuery;
private readonly IOrderRepository _orderRepository;
private readonly ITrackDetailsEsRepository _trackDetailsEsRepository;
public TrackContentService(
IStringLocalizer<TrackLocalizationResource> stringLocalizer,
ITrackContentRepository trackContentRepository,
IBasicQuery<TrackStatusEntity> trackStatusBasicQuery,
IBasicQuery<TrackFlagEntity> trackFlagBasicQuery)
IBasicQuery<TrackFlagEntity> trackFlagBasicQuery,
IOrderRepository orderRepository,
ITrackDetailsEsRepository trackDetailsEsRepository)
{
_stringLocalizer = stringLocalizer;
_trackContentRepository = trackContentRepository;
_trackStatusBasicQuery = trackStatusBasicQuery;
_trackFlagBasicQuery = trackFlagBasicQuery;
_orderRepository = orderRepository;
_trackDetailsEsRepository = trackDetailsEsRepository;
}
/// <summary>
@ -96,8 +105,7 @@ public class TrackContentService : ApplicationService
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("GetList")]
public async Task<UnifyPageResultDto<GetTrackContentListDto>> GetPageTrackContent(
GetPageTrackContentInput input)
public async Task<UnifyPageResultDto<GetTrackContentListDto>> GetPageTrackContent(GetPageTrackContentInput input)
{
var vo = ObjectMapper.Map<GetPageTrackContentInput, GetPageTrackContentVO>(input);
var resultDto = await _trackContentRepository.GetPageTrackContent(vo);
@ -181,6 +189,95 @@ public class TrackContentService : ApplicationService
return true;
}
/// <summary>
/// 根据轨迹内容code获取轨迹内容
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("GetTrackContentByCode")]
public async Task<UnifyResultDto<GetTrackContentByCodeOutput>> GetTrackContentByCodeAsync([FromBody] GetTrackContentByCodeInput input)
{
if (input.SystemId <= 0)
return new UnifyResultDto<GetTrackContentByCodeOutput>(false, "子系统Id必须大于等于0");
if (string.IsNullOrEmpty(input.Code))
return new UnifyResultDto<GetTrackContentByCodeOutput>(false, "轨迹内容code不能为空");
var content = await _trackContentRepository.GetByCodeAsync(input.SystemId, input.Code);
if (content == null)
return new UnifyResultDto<GetTrackContentByCodeOutput>(false, "在当前子系统中未找到指定code的轨迹内容");
var res = new UnifyResultDto<GetTrackContentByCodeOutput>(true)
{
Data = new GetTrackContentByCodeOutput
{
Content = content.Content,
EnContent = content.EnContent,
IsExternal = content.IsExternal
}
};
return res;
}
/// <summary>
/// 创建轨迹时获取可用的轨迹内容
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("GetAvailableContent")]
public async Task<UnifyResultDto<List<GetAvailableContentOutput>>> GetAvailableContent(GetAvailableContentInput input)
{
if (input.SystemId <= 0)
return new UnifyResultDto<List<GetAvailableContentOutput>>(false, "系统id需大于0!");
if (string.IsNullOrEmpty(input.OrderNo))
return new UnifyResultDto<List<GetAvailableContentOutput>>(false, "单号不能为空!");
//获取当前订单下已有的轨迹内容
var orderId = await _orderRepository.GetFirstAsync(x => x.OrderNo == input.OrderNo && x.SubSystemId == input.SystemId, x => x.Id);
if (orderId == default)
throw new BusinessException(message: "订单不存在!");
//获取轨迹详情
var trackDetails = await _trackDetailsEsRepository.GetListAsync(orderId);
//获取当前子系统下所有的轨迹内容
var contentList = await _trackContentRepository.GetListBySystemIdAsync(input.SystemId);
if (contentList == null)
throw new BusinessException(message: "当前子系统下未找到任何可用的轨迹内容!");
var res = new UnifyResultDto<List<GetAvailableContentOutput>>(true)
{
Data = new List<GetAvailableContentOutput>()
};
foreach (var item in contentList)
{
if (!item.IsRepeatable && trackDetails?.Any(m => m.TrackCode == item.Code) == true) //跳过已存在轨迹内容
continue;
if (!item.IsAllowManuallyCreate && input.TrackOptionType == TrackOptionType.创建) //跳过不允许手动创建的轨迹内容
continue;
if (!item.IsAllowManuallyUpdate && input.TrackOptionType == TrackOptionType.修改) //跳过不允许手动创建的轨迹内容
continue;
res.Data.Add(new GetAvailableContentOutput()
{
IsExternal = item.IsExternal,
EnContent = item.EnContent,
Content = item.Content,
Code = item.Code,
Id = item.Id
});
}
return res;
}
#region 私有方法
private async Task<UnifyResultDto> AddAsync(EditTrackContentInput input)

View File

@ -4,6 +4,7 @@ using SJZY.Track.Domain.Aggregates.OrderAggregate;
using SJZY.Track.Domain.Aggregates.TrackContentAggregate;
using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
using SJZY.Track.Domain.Aggregates.TrackPushAggregate;
using SJZY.Track.Domain.Aggregates.TrackStatusAggregate;
using SJZY.Track.Domain.Dtos.Order;
namespace SJZY.Track.Application.Services.TrackOrders;
@ -18,6 +19,7 @@ public class TrackOrderService : ApplicationService
private readonly IOrderOperationRecordEsRepository _orderOperationRecordEsRepository;
private readonly IOrderRepository _orderRepository;
private readonly ITrackContentRepository _trackContentRepository;
private readonly ITrackStatusRepository _trackStatusRepository;
private readonly ITrackDetailsEsRepository _trackDetailsEsRepository;
private readonly ITrackPushRecordEsRepository _trackPushRecordEsRepository;
@ -26,13 +28,15 @@ public class TrackOrderService : ApplicationService
ITrackDetailsEsRepository trackDetailsEsRepository,
ITrackContentRepository trackContentRepository,
ITrackPushRecordEsRepository trackPushRecordEsRepository,
IOrderOperationRecordEsRepository orderOperationRecordEsRepository)
IOrderOperationRecordEsRepository orderOperationRecordEsRepository,
ITrackStatusRepository trackStatusRepository)
{
_orderRepository = orderRepository;
_trackDetailsEsRepository = trackDetailsEsRepository;
_trackContentRepository = trackContentRepository;
_trackPushRecordEsRepository = trackPushRecordEsRepository;
_orderOperationRecordEsRepository = orderOperationRecordEsRepository;
_trackStatusRepository = trackStatusRepository;
}
#region 轨迹订单列表
@ -164,6 +168,73 @@ public class TrackOrderService : ApplicationService
return list;
}
/// <summary>
/// 按时间轴获取轨迹内容
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("GetDetailTimeline")]
public async Task<UnifyResultDto<List<GetDetailTimelineOutput>>> GetDetailTimeline(GetDetailTimelineInput input)
{
var res = new UnifyResultDto<List<GetDetailTimelineOutput>>(true);
var order = await _orderRepository.GetFirstAsync(m => m.OrderNo == input.OrderNumber);
if (order == null)
return new UnifyResultDto<List<GetDetailTimelineOutput>>(false, "订单不存在");
if (input.SystemId <= 0)
return new UnifyResultDto<List<GetDetailTimelineOutput>>(false, "子系统id不合法");
var trackStatus = await _trackStatusRepository.GetListAsync(m => m.SubSystemId == input.SystemId);
var trackDetails = await _trackDetailsEsRepository.GetListAsync(order.Id);
res.Data = new List<GetDetailTimelineOutput>();
var isCompleted = false;
foreach (var item in trackDetails)
{
//是否完结
isCompleted = trackStatus.Any(m => m.IsCompleted && m.Code == item.TrackStatus);
res.Data.Add(new GetDetailTimelineOutput()
{
IsHighlight = true,
Files = new List<string>(),
//Remark = item.Remark,
//TrackTimeZone = item.TrackTimeZone,
TrackTime = ToUnixTimestamp(item.TrackTime),
TrackPlace = item.TrackPlace,
EnContent = item.TrackEnContent,
Content = item.TrackContent,
TrackCode = item.TrackCode
});
}
//如果轨迹状态没完结则追加最后一个默认节点
if (!isCompleted)
{
res.Data.Add(new GetDetailTimelineOutput()
{
Content = "签收",
IsHighlight = false,
TrackTimeZone = $"GMT{(order.DestinationTimeZone >= 0 ? "+" : "-")}{order.DestinationTimeZone}",
TrackTime = ToUnixTimestamp(order.EstimatedDeliveryDate),
TrackTimePrefix = "预计签收时间:",
});
}
return res;
}
public static long ToUnixTimestamp(DateTime time)
{
//var sTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
var sTime = TimeZoneInfo.ConvertTime(new DateTime(1970, 1, 1), TimeZoneInfo.Utc, TimeZoneInfo.Local);
return (long) (time - sTime).TotalMilliseconds;
}
/// <summary>
/// 根据轨迹id删除单条轨迹
/// </summary>

View File

@ -172,6 +172,18 @@ public class OrderEntity : IFullAuditedBasicEntitys, IAggregateRoot
[SugarColumn(IsIgnore = true)] public List<OrderPullStatusEntity> OrderPullStatus { get; set; }
/// <summary>
/// 目的地时区
/// </summary>
[SugarColumn(ColumnName = "DestinationTimeZone")]
public float DestinationTimeZone { get; set; }
/// <summary>
/// 预计到达时间
/// </summary>
[SugarColumn(ColumnName = "EstimatedDeliveryDate")]
public DateTime EstimatedDeliveryDate { get; set; }
public void ResetTrackInfo()
{
IsCompleted = false;

View File

@ -26,4 +26,6 @@ public interface ITrackContentRepository : IBasicRepository<TrackContentEntity>
Expression<Func<TrackContentMapEntity, bool>> whereExpression);
Task<bool> GetTemplateIsExist(int trackContentId);
Task<TrackContentEntity> GetByCodeAsync(int systemId, string code);
Task<List<TrackContentEntity>> GetListBySystemIdAsync(int systemId);
}

View File

@ -36,6 +36,12 @@ public class TrackContentEntity : IFullAuditedBasicEntitys, IAggregateRoot
[SugarColumn(ColumnName = "SubSystemId")]
public int SubSystemId { get; set; }
/// <summary>
/// 子系统名称
/// </summary>
[SugarColumn(IsIgnore = true)]
public string SubSystem { get; set; }
/// <summary>
/// 轨迹标记id,多个逗号分隔
/// </summary>
@ -53,4 +59,28 @@ public class TrackContentEntity : IFullAuditedBasicEntitys, IAggregateRoot
/// </summary>
[SugarColumn(ColumnName = "IsExternal")]
public bool IsExternal { get; set; }
/// <summary>
/// 是否可重复
/// </summary>
[SugarColumn(ColumnName = "IsRepeatable")]
public bool IsRepeatable { get; set; }
/// <summary>
/// 是否允许手动修改
/// </summary>
[SugarColumn(ColumnName = "IsAllowManuallyUpdate")]
public bool IsAllowManuallyUpdate { get; set; }
/// <summary>
/// 是否允许手动创建
/// </summary>
[SugarColumn(ColumnName = "IsAllowManuallyCreate")]
public bool IsAllowManuallyCreate { get; set; }
/// <summary>
/// 是否同步轨迹订单上的预计到达时间
/// </summary>
[SugarColumn(ColumnName = "IsChangeOrderEdd")]
public bool IsChangeOrderEdd { get; set; }
}

View File

@ -113,7 +113,6 @@ public class TrackContentRepository : BasicRepository<TrackContentEntity>, ITrac
return false;
}
public async Task<UnifyPageResultDto<GetTrackContentMapPageOutputVO>> GetMapPageAsync(
GetTrackContentMapPageInputVO input)
{
@ -220,4 +219,27 @@ public class TrackContentRepository : BasicRepository<TrackContentEntity>, ITrac
return await Context.Updateable<TrackContentMapEntity>().SetColumns(columns).Where(whereExpression)
.ExecuteCommandAsync() > 0;
}
public Task<TrackContentEntity> GetByCodeAsync(int systemId, string code)
{
return Context.Queryable<TrackContentEntity>().FirstAsync(m => m.SubSystemId == systemId && m.Code == code);
}
public Task<List<TrackContentEntity>> GetListBySystemIdAsync(int systemId)
{
return Context.Queryable<TrackContentEntity>()
.Where(content => content.SubSystemId == systemId && !content.IsDeleted)
.Select((content) => new TrackContentEntity
{
Id = content.Id,
Code = content.Code,
IsExternal = content.IsExternal,
EnContent = content.EnContent,
Content = content.Content,
IsRepeatable = content.IsRepeatable,
IsAllowManuallyCreate = content.IsAllowManuallyCreate,
IsAllowManuallyUpdate = content.IsAllowManuallyUpdate,
})
.ToListAsync();
}
}