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
{
///
/// 场景唯一id (传0视为新增)
///
public int Id { get; set; }
///
/// 预警规则主体id
///
public int WarningId { get; set; }
///
/// 是否中转(单一)
///
public bool? IsTransit { get; set; }
///
/// 货物类型(多个,分割)
///
public string? CargoType { get; set; }
///
/// 起运港口(多个,分割)
///
public string? LeavePort { get; set; }
///
/// 产品编码(多个,分割)
///
public string? ProductCode { get; set; }
///
/// 月份(多个/分割)
///
public string? Months { get; set; }
///
/// 区域Id(单一)
///
public int? AreaId { get; set; }
public bool CanHitScene(OrderEntity order, List? 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()
: 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
};
}
}