179 lines
7.1 KiB
C#
179 lines
7.1 KiB
C#
using System.Diagnostics;
|
|
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.TrackContentAggregate;
|
|
using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
|
|
using SJZY.Track.Domain.Aggregates.TrackPushAggregate;
|
|
using SJZY.Track.Domain.Dtos.Order;
|
|
using SJZY.Track.Domain.Dtos.TrackTemplate;
|
|
using SJZY.Track.Domain.Enums;
|
|
using SJZY.Track.Domain.Queries;
|
|
|
|
namespace SJZY.Track.Application.Services.TrackOrders;
|
|
|
|
[ApiExplorerSettings(GroupName = "轨迹订单")]
|
|
[Route("/Track/Order")]
|
|
public class TrackOrderService : ApplicationService
|
|
{
|
|
private readonly IOrderRepository _orderRepository;
|
|
private readonly ITrackOrderQueries _trackOrderQueries;
|
|
private readonly ITrackDetailsRepository _trackDetailsRepository;
|
|
private readonly ITrackContentRepository _trackContentRepository;
|
|
private readonly ITrackPushRecordsRepository _trackPushRecordsRepository;
|
|
|
|
public TrackOrderService(
|
|
IOrderRepository orderRepository,
|
|
ITrackOrderQueries trackOrderQueries,
|
|
ITrackDetailsRepository trackDetailsRepository,
|
|
ITrackContentRepository trackContentRepository,
|
|
ITrackPushRecordsRepository trackPushRecordsRepository
|
|
)
|
|
{
|
|
_orderRepository = orderRepository;
|
|
_trackOrderQueries = trackOrderQueries;
|
|
_trackDetailsRepository = trackDetailsRepository;
|
|
_trackContentRepository = trackContentRepository;
|
|
_trackPushRecordsRepository = trackPushRecordsRepository;
|
|
}
|
|
|
|
#region 轨迹订单明细
|
|
|
|
/// <summary>
|
|
/// 根据轨迹订单id获取轨迹订单明细列表
|
|
/// </summary>
|
|
/// <param name="input"></param>
|
|
/// <returns></returns>
|
|
[HttpPost("GetDetails")]
|
|
public async Task<List<TrackOrderDetailDto>> GetOrderDetails(GetOrderDetailsInput input)
|
|
{
|
|
var trackDetails = await _trackDetailsRepository.GetListAsync(input.OrderId);
|
|
if (!trackDetails.IsNullOrEmpty())
|
|
{
|
|
var list = ObjectMapper.Map<List<TrackDetailsIndex>, List<TrackOrderDetailDto>>(trackDetails);
|
|
var trackCodes = list.Where(a => !a.Code.IsNullOrWhiteSpace()).Select(a => a.Code).Distinct().ToList();
|
|
|
|
var trackContents = await _trackContentRepository.GetTrackContentAttributeValue(
|
|
new GetTemplateContentAttributeValueInputVO
|
|
{
|
|
SubSystemId = input.SubSystemId,
|
|
TrackTemplateIds = input.TrackTemplateIds,
|
|
TrackCodes = trackCodes
|
|
});
|
|
Debug.Assert(input.TrackTemplateIds != null, "input.TrackTemplateIds != null");
|
|
input.TrackTemplateIds = input.TrackTemplateIds.Where(a => a > 0).ToList();
|
|
list.ForEach(a =>
|
|
{
|
|
var trackContentsOfTemplates = trackContents.Where(b =>
|
|
b.SubSystemId == input.SubSystemId && b.TrackCode == a.Code &&
|
|
input.TrackTemplateIds.Contains(b.TrackTemplateId))
|
|
.ToList();
|
|
GetTemplateContentAttributeValueVO? trackContent = null;
|
|
var insertData = input.TrackTemplateIds
|
|
.Intersect(trackContentsOfTemplates.Select(aa => aa.TrackTemplateId)).ToList();
|
|
if (!insertData.IsNullOrEmpty())
|
|
{
|
|
trackContent =
|
|
trackContentsOfTemplates.FirstOrDefault(it =>
|
|
it.TrackTemplateId == insertData.FirstOrDefault());
|
|
}
|
|
|
|
if (trackContent != null)
|
|
{
|
|
a.IsExternal = trackContent.IsExternal;
|
|
}
|
|
|
|
if (a.TrackTimeZoneValue == 0f)
|
|
{
|
|
a.TrackTimeZone = "GTM +00:00";
|
|
}
|
|
else
|
|
{
|
|
// 将小数形式的小时转换为时区偏移量
|
|
int hours = (int)a.TrackTimeZoneValue; // 提取整数部分作为小时
|
|
int minutes = (int)((a.TrackTimeZoneValue - hours) * 60); // 将小数部分乘以 60 转换为分钟
|
|
TimeSpan offset = new TimeSpan(hours, minutes, 0);
|
|
string timeZoneStr = offset.ToString();
|
|
string flag = a.TrackTimeZoneValue > 0f ? "+" : "";
|
|
a.TrackTimeZone = $"GTM {flag}{timeZoneStr.RemovePostFix(":00")}";
|
|
}
|
|
});
|
|
return list;
|
|
}
|
|
|
|
return new List<TrackOrderDetailDto>();
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region 轨迹订单列表
|
|
|
|
/// <summary>
|
|
/// 获取分页的轨迹订单
|
|
/// </summary>
|
|
/// <param name="input"></param>
|
|
/// <returns></returns>
|
|
[HttpPost("GetTrackOrderList")]
|
|
public async Task<UnifyPageResultDto<TrackOrderDto>> GetPageTrackOrder(GetPageTrackOrderInput input)
|
|
{
|
|
var vo = ObjectMapper.Map<GetPageTrackOrderInput, GetPageTrackOrderInputVO>(input);
|
|
var pageList = await _trackOrderQueries.GetPageTrackOrder(vo);
|
|
var pageResultDto =
|
|
ObjectMapper.Map<UnifyPageResultDto<TrackOrderVO>, UnifyPageResultDto<TrackOrderDto>>(pageList);
|
|
return pageResultDto;
|
|
}
|
|
|
|
#endregion
|
|
|
|
[HttpPost("UpdateOrderStatus")]
|
|
public async Task<bool> UpdateOrderStatus(UpdateOrderStatusInput input)
|
|
{
|
|
var order = await _orderRepository.GetFirstAsync(x => x.Id == input.OrderId);
|
|
|
|
if (order == default) throw new BusinessException(message: "订单不存在");
|
|
|
|
order.IsCompleted = input.IsCompleted;
|
|
|
|
return await _orderRepository.UpdateColumnAsync(order, x => new { x.IsCompleted });
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取轨迹计数器
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
[HttpGet("GetTrackCounter")]
|
|
public async Task<GetTrackCounterOutput> GetTrackCounterAsync()
|
|
{
|
|
var counts = await _trackOrderQueries.GetTrackProblemCountsAsync();
|
|
|
|
return new GetTrackCounterOutput
|
|
{
|
|
TotalCount = counts.Sum(x => x.Count),
|
|
ErrorCount = counts.FirstOrDefault(x => x.ProblemType == (int)TrackProblemType.Error)?.Count ?? 0,
|
|
WarnCount = counts.FirstOrDefault(x => x.ProblemType == (int)TrackProblemType.Warn)?.Count ?? 0,
|
|
};
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取轨迹推送记录
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
/// <param name="orderId">订单id</param>
|
|
[HttpGet("GetTrackPushRecords")]
|
|
public async Task<List<TrackPushRecordOutput>> GetTrackPushRecordsAsync(int orderId)
|
|
{
|
|
var records = await _trackPushRecordsRepository.GetTrackPushRecordsAsync(orderId);
|
|
|
|
var res = ObjectMapper.Map<List<TrackPushRecordIndex>, List<TrackPushRecordOutput>>(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;
|
|
}
|
|
} |