162 lines
4.9 KiB
C#
162 lines
4.9 KiB
C#
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
|
||
};
|
||
}
|
||
}
|