Merge branch 'refs/heads/S04轨迹预警' into dev
This commit is contained in:
commit
ae0059eeaf
@ -23,19 +23,7 @@ public class TrackChangeAfterUpdateOrderEventHandler : ITransientDependency, ICa
|
|||||||
[CapSubscribe(GlobalConst.TrackChangeAfterUpdateOrderSubscribe)]
|
[CapSubscribe(GlobalConst.TrackChangeAfterUpdateOrderSubscribe)]
|
||||||
public async Task ConsumerAsync(TrackChangeAfterUpdateOrderEvent @event)
|
public async Task ConsumerAsync(TrackChangeAfterUpdateOrderEvent @event)
|
||||||
{
|
{
|
||||||
var orders = await _orderRepository.GetListAsync(x => @event.OrderIds.Contains(x.Id),
|
var orders = await _orderRepository.GetListAsync(x => @event.OrderIds.Contains(x.Id), x => MapOrderSummary(x));
|
||||||
x => new OrderEntity
|
|
||||||
{
|
|
||||||
Id = x.Id,
|
|
||||||
IsCompleted = x.IsCompleted,
|
|
||||||
LatestTrackContent = x.LatestTrackContent,
|
|
||||||
LatestTrackEnContent = x.LatestTrackEnContent,
|
|
||||||
LatestTrackPlace = x.LatestTrackPlace,
|
|
||||||
LatestTrackTime = x.LatestTrackTime,
|
|
||||||
LatestTrackTimeZone = x.LatestTrackTimeZone,
|
|
||||||
ArrivalCountry = x.ArrivalCountry,
|
|
||||||
ArrivalCity = x.ArrivalCity,
|
|
||||||
});
|
|
||||||
|
|
||||||
if (orders.Count == 0) return;
|
if (orders.Count == 0) return;
|
||||||
|
|
||||||
@ -70,10 +58,47 @@ public class TrackChangeAfterUpdateOrderEventHandler : ITransientDependency, ICa
|
|||||||
x.IsCompleted, x.LatestTrackContent, x.LatestTrackEnContent, x.LatestTrackPlace, x.LatestTrackTime,
|
x.IsCompleted, x.LatestTrackContent, x.LatestTrackEnContent, x.LatestTrackPlace, x.LatestTrackTime,
|
||||||
x.LatestTrackTimeZone
|
x.LatestTrackTimeZone
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 预警计算
|
||||||
|
WarningCalculationAsync(orders);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Task WarningCalculationAsync(List<OrderEntity> orders)
|
||||||
|
{
|
||||||
|
var forewarningOrderModels = orders.Select(OrderToForewarningOrderModel).ToList();
|
||||||
|
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
private OrderEntity MapOrderSummary(OrderEntity x)
|
||||||
|
{
|
||||||
|
return new OrderEntity
|
||||||
|
{
|
||||||
|
Id = x.Id,
|
||||||
|
|
||||||
|
// 轨迹
|
||||||
|
IsCompleted = x.IsCompleted,
|
||||||
|
LatestTrackContent = x.LatestTrackContent,
|
||||||
|
LatestTrackEnContent = x.LatestTrackEnContent,
|
||||||
|
LatestTrackPlace = x.LatestTrackPlace,
|
||||||
|
LatestTrackTime = x.LatestTrackTime,
|
||||||
|
LatestTrackTimeZone = x.LatestTrackTimeZone,
|
||||||
|
|
||||||
|
// 因素
|
||||||
|
CargoType = x.CargoType,
|
||||||
|
CreateTime = x.CreateTime,
|
||||||
|
ArrivalCountry = x.ArrivalCountry,
|
||||||
|
ArrivalProvince = x.ArrivalProvince,
|
||||||
|
ArrivalCity = x.ArrivalCity,
|
||||||
|
ArrivalPostCode = x.ArrivalPostCode,
|
||||||
|
IsTransit = x.IsTransit,
|
||||||
|
LeavePort = x.LeavePort,
|
||||||
|
ProductCode = x.ProductCode
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private ForewarningOrderModel OrderToForewarningOrderModel(OrderEntity order)
|
private ForewarningOrderModel OrderToForewarningOrderModel(OrderEntity order)
|
||||||
{
|
{
|
||||||
return new ForewarningOrderModel
|
return new ForewarningOrderModel
|
||||||
{
|
{
|
||||||
Id = order.Id,
|
Id = order.Id,
|
||||||
@ -83,28 +108,28 @@ public class TrackChangeAfterUpdateOrderEventHandler : ITransientDependency, ICa
|
|||||||
CargoType = order.CargoType,
|
CargoType = order.CargoType,
|
||||||
Month = order.CreateTime.Month,
|
Month = order.CreateTime.Month,
|
||||||
Area = DetermineAreaBasedOnOrderDetails(order),
|
Area = DetermineAreaBasedOnOrderDetails(order),
|
||||||
IsTransit = order.IsTransfer,
|
IsTransit = order.IsTransit,
|
||||||
DeparturePort = order.LeavePort,
|
LeavePort = order.LeavePort,
|
||||||
ProductCode = order.ProductCode
|
ProductCode = order.ProductCode
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
// Placeholder methods for deriving or converting values. You'll need to implement these based on your specific logic.
|
// Placeholder methods for deriving or converting values. You'll need to implement these based on your specific logic.
|
||||||
private int DetermineTrackBasedOnOrderDetails(OrderEntity order)
|
private int DetermineTrackBasedOnOrderDetails(OrderEntity order)
|
||||||
{
|
{
|
||||||
// Implement logic to determine Track
|
// Implement logic to determine Track
|
||||||
return default;
|
return default;
|
||||||
}
|
}
|
||||||
|
|
||||||
private int? DetermineMonthBasedOnOrderDetails(OrderEntity order)
|
private int? DetermineMonthBasedOnOrderDetails(OrderEntity order)
|
||||||
{
|
{
|
||||||
// Implement logic to determine Month
|
// Implement logic to determine Month
|
||||||
return default;
|
return default;
|
||||||
}
|
}
|
||||||
|
|
||||||
private int? DetermineAreaBasedOnOrderDetails(OrderEntity order)
|
private int? DetermineAreaBasedOnOrderDetails(OrderEntity order)
|
||||||
{
|
{
|
||||||
// Implement logic to determine Area
|
// Implement logic to determine Area
|
||||||
return default;
|
return default;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1,3 +1,5 @@
|
|||||||
|
using System.Dynamic;
|
||||||
|
using Nest;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using SJZY.Expand.ABP.Core.PublicMethords;
|
using SJZY.Expand.ABP.Core.PublicMethords;
|
||||||
using SJZY.Track.Application.Contract.Dtos.Forewarning;
|
using SJZY.Track.Application.Contract.Dtos.Forewarning;
|
||||||
@ -30,7 +32,7 @@ public class ForewarningHelper
|
|||||||
throw new BusinessException(message: "轨迹状态区间或因素列表为空");
|
throw new BusinessException(message: "轨迹状态区间或因素列表为空");
|
||||||
}
|
}
|
||||||
|
|
||||||
var rules = Enumerable.Repeat(new WarningRuleEntity(), len).ToList();
|
var rules = Enumerable.Range(0, len).Select(_ => new WarningRuleEntity()).ToList();
|
||||||
|
|
||||||
var repeat = len / statusSpans.Count;
|
var repeat = len / statusSpans.Count;
|
||||||
|
|
||||||
@ -41,7 +43,7 @@ public class ForewarningHelper
|
|||||||
var factorValueCount = factor.FactorValue.Count;
|
var factorValueCount = factor.FactorValue.Count;
|
||||||
|
|
||||||
// repeat梯度下降,与times成反比关系
|
// repeat梯度下降,与times成反比关系
|
||||||
repeat /= factor.FactorValue.Count;
|
repeat /= factorValueCount;
|
||||||
var times = len / repeat / factorValueCount;
|
var times = len / repeat / factorValueCount;
|
||||||
FillFactor(factor, rules, repeat, times);
|
FillFactor(factor, rules, repeat, times);
|
||||||
}
|
}
|
||||||
@ -184,4 +186,53 @@ public class ForewarningHelper
|
|||||||
}).ToList()
|
}).ToList()
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static List<dynamic> DynamicCalcRuleList(List<WarningRuleVo> rules, List<RuleFactorType> factors)
|
||||||
|
{
|
||||||
|
var dynamicList = new List<dynamic>();
|
||||||
|
|
||||||
|
foreach (var rule in rules)
|
||||||
|
{
|
||||||
|
dynamic dynamicRule = new ExpandoObject();
|
||||||
|
var dynamicRuleDict = (IDictionary<string, object?>)dynamicRule;
|
||||||
|
|
||||||
|
dynamicRuleDict[nameof(Id)] = rule.Id;
|
||||||
|
dynamicRuleDict[nameof(rule.StartTrackStatus)] = rule.StartTrackStatus;
|
||||||
|
dynamicRuleDict[nameof(rule.EndTrackStatus)] = rule.EndTrackStatus;
|
||||||
|
|
||||||
|
foreach (var factor in factors)
|
||||||
|
{
|
||||||
|
switch (factor)
|
||||||
|
{
|
||||||
|
case RuleFactorType.CargoType:
|
||||||
|
dynamicRuleDict[nameof(rule.CargoType)] = rule.CargoType;
|
||||||
|
break;
|
||||||
|
case RuleFactorType.Months:
|
||||||
|
dynamicRuleDict[nameof(rule.Months)] = rule.Months;
|
||||||
|
break;
|
||||||
|
case RuleFactorType.Areas:
|
||||||
|
dynamicRuleDict[nameof(rule.Area)] = rule.Area;
|
||||||
|
break;
|
||||||
|
case RuleFactorType.IsTransit:
|
||||||
|
dynamicRuleDict[nameof(rule.IsTransit)] = rule.IsTransit;
|
||||||
|
break;
|
||||||
|
case RuleFactorType.LeavePort:
|
||||||
|
dynamicRuleDict[nameof(rule.LeavePort)] = rule.LeavePort;
|
||||||
|
break;
|
||||||
|
case RuleFactorType.ProductCode:
|
||||||
|
dynamicRuleDict[nameof(rule.ProductCode)] = rule.ProductCode;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new BusinessException(message: $"不支持的因素:{factor}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dynamicRuleDict[nameof(rule.TotalTimeSpan)] = rule.TotalTimeSpan;
|
||||||
|
dynamicRuleDict[nameof(rule.WarnTimeSpan)] = rule.WarnTimeSpan;
|
||||||
|
dynamicRuleDict[nameof(rule.WarnCount)] = rule.WarnCount;
|
||||||
|
dynamicList.Add(dynamicRule);
|
||||||
|
}
|
||||||
|
|
||||||
|
return dynamicList;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@ -221,7 +221,7 @@ public class ForewarningNotifyService : IForewarningNotifyService, ITransientDep
|
|||||||
case RuleFactorType.CargoType:
|
case RuleFactorType.CargoType:
|
||||||
return rule.CargoType;
|
return rule.CargoType;
|
||||||
case RuleFactorType.LeavePort:
|
case RuleFactorType.LeavePort:
|
||||||
return rule.DeparturePort;
|
return rule.LeavePort;
|
||||||
case RuleFactorType.Months:
|
case RuleFactorType.Months:
|
||||||
return rule.Month.HasValue ? rule.Month.Value.ToString() : throw new Exception("月份不能为空");
|
return rule.Month.HasValue ? rule.Month.Value.ToString() : throw new Exception("月份不能为空");
|
||||||
case RuleFactorType.ProductCode:
|
case RuleFactorType.ProductCode:
|
||||||
|
|||||||
@ -3,6 +3,7 @@ using SJZY.Track.Application.Contract.Dtos.Forewarning;
|
|||||||
using SJZY.Track.Application.Helpers;
|
using SJZY.Track.Application.Helpers;
|
||||||
using SJZY.Track.Domain.Aggregates.ForewarningAggregate;
|
using SJZY.Track.Domain.Aggregates.ForewarningAggregate;
|
||||||
using SJZY.Track.Domain.Dtos.Forewarning;
|
using SJZY.Track.Domain.Dtos.Forewarning;
|
||||||
|
using SJZY.Track.Domain.Queries;
|
||||||
|
|
||||||
namespace SJZY.Track.Application.Services.ForewarningServices;
|
namespace SJZY.Track.Application.Services.ForewarningServices;
|
||||||
|
|
||||||
@ -38,6 +39,13 @@ public class ForewarningService : ApplicationService
|
|||||||
public async Task<bool> CreateWarning(CreateWarningInput input)
|
public async Task<bool> CreateWarning(CreateWarningInput input)
|
||||||
{
|
{
|
||||||
var warning = ObjectMapper.Map<CreateWarningInput, WarningEntity>(input);
|
var warning = ObjectMapper.Map<CreateWarningInput, WarningEntity>(input);
|
||||||
|
|
||||||
|
if (await _warningRepository.IsAnyAsync(x =>
|
||||||
|
x.SubSystemId == warning.SubSystemId && x.CustomerId == warning.CustomerId && x.Name == warning.Name))
|
||||||
|
{
|
||||||
|
throw new BusinessException(message: "该子系统下的客户已经存在一个同名预警: " + warning.Name);
|
||||||
|
}
|
||||||
|
|
||||||
warning.WarningRules = ForewarningHelper.CalcRuleList(input.TrackStatusSpans, input.WarningFactors);
|
warning.WarningRules = ForewarningHelper.CalcRuleList(input.TrackStatusSpans, input.WarningFactors);
|
||||||
warning.WarningFactors = ForewarningHelper.MapFactorEntities(input.WarningFactors);
|
warning.WarningFactors = ForewarningHelper.MapFactorEntities(input.WarningFactors);
|
||||||
warning.WarningNotifies = ForewarningHelper.MapNotifyEntities(input);
|
warning.WarningNotifies = ForewarningHelper.MapNotifyEntities(input);
|
||||||
@ -131,13 +139,16 @@ public class ForewarningService : ApplicationService
|
|||||||
/// 查询预警规则列表
|
/// 查询预警规则列表
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="warningId">预警规则id</param>
|
/// <param name="warningId">预警规则id</param>
|
||||||
|
/// <param name="factorQuery"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[HttpGet("GetWarningRuleList")]
|
[HttpGet("GetWarningRuleList")]
|
||||||
public async Task<List<WarningRuleVo>> GetWarningRuleListAsync([Required] int warningId)
|
public async Task<List<dynamic>> GetWarningRuleListAsync([Required] int warningId, [FromServices] IBasicQuery<WarningFactorEntity> factorQuery)
|
||||||
{
|
{
|
||||||
|
var factors = await factorQuery.GetListAsync(x => x.WarningId == warningId, x => x.Type);
|
||||||
var rules = await _warningRepository.GetWarningRuleListAsync(warningId);
|
var rules = await _warningRepository.GetWarningRuleListAsync(warningId);
|
||||||
|
|
||||||
return rules;
|
var dynamicList = ForewarningHelper.DynamicCalcRuleList(rules, factors);
|
||||||
|
return dynamicList;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@ -133,19 +133,19 @@ public class OrderEntity : IFullAuditedBasicEntitys, IAggregateRoot
|
|||||||
public string? LeavePort { get; set; }
|
public string? LeavePort { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 起运港口
|
/// 货物类型
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[SugarColumn(ColumnName = "CargoType")]
|
[SugarColumn(ColumnName = "CargoType")]
|
||||||
public string? CargoType { get; set; }
|
public string? CargoType { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 起运港口
|
/// 是否中转
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[SugarColumn(ColumnName = "IsTransfer")]
|
[SugarColumn(ColumnName = "IsTransit")]
|
||||||
public bool? IsTransfer { get; set; }
|
public bool? IsTransit { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 起运港口
|
/// 产品编码
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[SugarColumn(ColumnName = "ProductCode")]
|
[SugarColumn(ColumnName = "ProductCode")]
|
||||||
public string? ProductCode { get; set; }
|
public string? ProductCode { get; set; }
|
||||||
@ -157,16 +157,16 @@ public class OrderEntity : IFullAuditedBasicEntitys, IAggregateRoot
|
|||||||
public int? DeficiencyTag { get; set; }
|
public int? DeficiencyTag { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 邮编
|
/// 到达邮编
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[SugarColumn(ColumnName = "Postcode")]
|
[SugarColumn(ColumnName = "ArrivalPostCode")]
|
||||||
public string? Postcode { get; set; }
|
public string? ArrivalPostCode { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 州省
|
/// 到达州省
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[SugarColumn(ColumnName = "Province")]
|
[SugarColumn(ColumnName = "ArrivalProvince")]
|
||||||
public string? Province { get; set; }
|
public string? ArrivalProvince { get; set; }
|
||||||
|
|
||||||
[SugarColumn(IsIgnore = true)] public List<OrderFlightEntity> OrderFlights { get; set; }
|
[SugarColumn(IsIgnore = true)] public List<OrderFlightEntity> OrderFlights { get; set; }
|
||||||
[SugarColumn(IsIgnore = true)] public List<OrderTemplateEntity> OrderTemplates { get; set; }
|
[SugarColumn(IsIgnore = true)] public List<OrderTemplateEntity> OrderTemplates { get; set; }
|
||||||
|
|||||||
@ -16,7 +16,7 @@ public class ForewarningOrderModel:IForewarningFactorValue
|
|||||||
|
|
||||||
public int CustomerId { get; set; }
|
public int CustomerId { get; set; }
|
||||||
|
|
||||||
public string CargoType { get; set; }
|
public string? CargoType { get; set; }
|
||||||
|
|
||||||
public int? Month { get; set; }
|
public int? Month { get; set; }
|
||||||
|
|
||||||
@ -24,7 +24,10 @@ public class ForewarningOrderModel:IForewarningFactorValue
|
|||||||
|
|
||||||
public bool? IsTransit { get; set; }
|
public bool? IsTransit { get; set; }
|
||||||
|
|
||||||
public string DeparturePort { get; set; }
|
/// <summary>
|
||||||
|
/// 起运港
|
||||||
|
/// </summary>
|
||||||
|
public string? LeavePort { get; set; }
|
||||||
|
|
||||||
public string ProductCode { get; set; }
|
public string? ProductCode { get; set; }
|
||||||
}
|
}
|
||||||
@ -13,12 +13,12 @@ public record struct ForewarningRuleItem:IForewarningFactorValue
|
|||||||
public int Count { get; set; }
|
public int Count { get; set; }
|
||||||
public int TrackStart { get; set; }
|
public int TrackStart { get; set; }
|
||||||
public int TrackEnd { get; set; }
|
public int TrackEnd { get; set; }
|
||||||
public string CargoType { get; set; }
|
public string? CargoType { get; set; }
|
||||||
public int? Month { get; set; }
|
public int? Month { get; set; }
|
||||||
public int? Area { get; set; }
|
public int? Area { get; set; }
|
||||||
public bool? IsTransit { get; set; }
|
public bool? IsTransit { get; set; }
|
||||||
public string DeparturePort { get; set; }
|
public string? LeavePort { get; set; }
|
||||||
public string ProductCode { get; set; }
|
public string? ProductCode { get; set; }
|
||||||
|
|
||||||
public string Conect { get; set; }
|
public string Conect { get; set; }
|
||||||
|
|
||||||
|
|||||||
@ -2,7 +2,7 @@ namespace SJZY.Track.Domain.Dtos.Forewarning;
|
|||||||
|
|
||||||
public interface IForewarningFactorValue
|
public interface IForewarningFactorValue
|
||||||
{
|
{
|
||||||
public string CargoType { get; set; }
|
public string? CargoType { get; set; }
|
||||||
|
|
||||||
public int? Month { get; set; }
|
public int? Month { get; set; }
|
||||||
|
|
||||||
@ -10,7 +10,7 @@ public interface IForewarningFactorValue
|
|||||||
|
|
||||||
public bool? IsTransit { get; set; }
|
public bool? IsTransit { get; set; }
|
||||||
|
|
||||||
public string DeparturePort { get; set; }
|
public string? LeavePort { get; set; }
|
||||||
|
|
||||||
public string ProductCode { get; set; }
|
public string? ProductCode { get; set; }
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue
Block a user