track/src/SJZY.Track.Application/Services/Warning/Handlers/Model/TransportWarningSceneBO.cs
2025-03-05 10:46:13 +08:00

162 lines
4.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using SJZY.Track.Application.Contract.Dtos.Warning.Transport;
using SJZY.Track.Domain.Aggregates.KPIAreaAggregate;
using SJZY.Track.Domain.Aggregates.OrderAggregate;
using SJZY.Track.Domain.Aggregates.WarningAggregate.Transport;
namespace SJZY.Track.Application.Services.Warning.Handlers.Model;
public sealed class TransportWarningSceneBO
{
/// <summary>
/// 场景唯一id (传0视为新增)
/// </summary>
public int Id { get; set; }
/// <summary>
/// 预警规则主体id
/// </summary>
public int WarningId { get; set; }
/// <summary>
/// 是否中转(单一)
/// </summary>
public bool? IsTransit { get; set; }
/// <summary>
/// 货物类型(多个,分割)
/// </summary>
public string? CargoType { get; set; }
/// <summary>
/// 起运港口(多个,分割)
/// </summary>
public string? LeavePort { get; set; }
/// <summary>
/// 产品编码(多个,分割)
/// </summary>
public string? ProductCode { get; set; }
/// <summary>
/// 月份(多个/分割)
/// </summary>
public string? Months { get; set; }
/// <summary>
/// 区域Id(单一)
/// </summary>
public int? AreaId { get; set; }
public bool CanHitScene(OrderEntity order, List<RuleAreaInfoEntity>? ruleAreas)
{
// 是否中转
if (IsTransit != null && IsTransit != order.IsTransit) return false;
// 货物类型
if (!string.IsNullOrWhiteSpace(CargoType) && order.CargoType != CargoType) return false;
// 启运港口
if (!string.IsNullOrWhiteSpace(LeavePort) && order.LeavePort != LeavePort) return false;
// 产品编码
if (!string.IsNullOrWhiteSpace(ProductCode) && order.ProductCode != ProductCode) return false;
// 月份
if (!string.IsNullOrWhiteSpace(Months))
{
var months = string.IsNullOrEmpty(Months)
? new HashSet<int>()
: Months.Split('/').Select(int.Parse).ToHashSet();
// 订单创建时间月份
var orderCreateTimeMonth = order.CreateTime.Month;
if (!months.Contains(orderCreateTimeMonth)) return false;
}
// 区域
if (ruleAreas != null && ruleAreas.Count > 0)
{
// 使用订单到达国家的二字码匹配区域
var areas = ruleAreas.Where(area => order.ArrivalCountry == area.CountryCode).ToList();
foreach (var area in areas)
{
// 邮编是否在关注的范围内?
if (!string.IsNullOrWhiteSpace(area.LeftPostcode) && !string.IsNullOrWhiteSpace(area.RightPostcode))
{
// tips: 参考小包的邮编匹配,字典序
if (string.CompareOrdinal(order.ArrivalPostCode, area.LeftPostcode) < 0 ||
string.CompareOrdinal(order.ArrivalPostCode, area.RightPostcode) > 0)
return false;
}
// 城市是否匹配?
if (!string.IsNullOrWhiteSpace(area.City) && order.ArrivalCity != area.City) return false;
// 省份是否匹配?
if (!string.IsNullOrWhiteSpace(area.Province) && order.ArrivalProvince != area.Province) return false;
}
}
return true;
}
public static TransportWarningSceneEntity ToEntity(TransportWarningSceneBO bo)
{
return new TransportWarningSceneEntity(
bo.Id,
bo.WarningId,
bo.CargoType,
bo.Months,
bo.AreaId,
bo.IsTransit,
bo.LeavePort,
bo.ProductCode
);
}
public TransportWarningSceneEntity ToEntity()
{
return new TransportWarningSceneEntity(
Id,
WarningId,
CargoType,
Months,
AreaId,
IsTransit,
LeavePort,
ProductCode
);
}
public static TransportWarningSceneBO From(TransportWarningSceneEntity entity)
{
return new TransportWarningSceneBO
{
Id = entity.Id,
WarningId = entity.WarningId,
CargoType = entity.CargoType,
Months = entity.Months,
AreaId = entity.AreaId,
IsTransit = entity.IsTransit,
LeavePort = entity.LeavePort,
ProductCode = entity.ProductCode
};
}
public static TransportWarningSceneBO From(UpsertTransportWarningSceneInput input)
{
return new TransportWarningSceneBO
{
Id = input.Id,
WarningId = input.WarningId,
CargoType = input.CargoType,
Months = input.Months,
AreaId = input.AreaId,
IsTransit = input.IsTransit,
LeavePort = input.LeavePort,
ProductCode = input.ProductCode
};
}
}