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 }; } }