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 轨迹订单明细
///
/// 根据轨迹订单id获取轨迹订单明细列表
///
///
///
[HttpPost("GetDetails")]
public async Task> GetOrderDetails(GetOrderDetailsInput input)
{
var trackDetails = await _trackDetailsRepository.GetListAsync(input.OrderId);
if (!trackDetails.IsNullOrEmpty())
{
var list = ObjectMapper.Map, List>(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();
}
#endregion
#region 轨迹订单列表
///
/// 获取分页的轨迹订单
///
///
///
[HttpPost("GetTrackOrderList")]
public async Task> GetPageTrackOrder(GetPageTrackOrderInput input)
{
var vo = ObjectMapper.Map(input);
var pageList = await _trackOrderQueries.GetPageTrackOrder(vo);
var pageResultDto =
ObjectMapper.Map, UnifyPageResultDto>(pageList);
return pageResultDto;
}
#endregion
[HttpPost("UpdateOrderStatus")]
public async Task 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 });
}
///
/// 获取轨迹计数器
///
///
[HttpGet("GetTrackCounter")]
public async Task 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,
};
}
///
/// 获取轨迹推送记录
///
///
/// 订单id
[HttpGet("GetTrackPushRecords")]
public async Task> GetTrackPushRecordsAsync(int 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;
}
}