using JetBrains.Annotations; using SJZY.Track.Domain.Aggregates.ForewarningAggregate; namespace SJZY.Track.Application.Helpers; public class ForewarningFactorHelper { public static RuleItemEntity[] GetFactorItem([NotNull] RuleFactorEntity ruleFactors) { var total = Factorial(ruleFactors); var ruleCollect = AllocateFactor(total, ruleFactors.RuleId); Assignment(ruleCollect, total, ruleFactors.Tracks, (item, value) => { item.TrackEnd = value.End; item.TrackStart = value.Start; }); Assignment(ruleCollect, total, ruleFactors.CargoTypes, (item, value) => item.CargoType = value); Assignment(ruleCollect, total, ruleFactors.Months, (item, value) => item.Month = value); Assignment(ruleCollect, total, ruleFactors.Areas, (item, value) => item.Area = value); Assignment(ruleCollect, total, ruleFactors.IsTransit, (item, value) => item.IsTransit = value); Assignment(ruleCollect, total, ruleFactors.DeparturePorts, (item, value) => item.DeparturePort = value); Assignment(ruleCollect, total, ruleFactors.ProductCodes, (item, value) => item.ProductCode = value); return ruleCollect.ToArray(); } private static void Assignment(Span ruleCollect, int total, IReadOnlyList values, Action action) { if (values.Count == 0) { return; } var segment = total / values.Count; for (int index = 0; index < values.Count; index++) { var start = index * segment; var assignmentSlice = ruleCollect.Slice(start, segment); foreach (var item in assignmentSlice) { action(item, values[index]); } } } private static Span AllocateFactor(int total, int ruleId) { Span factors = new RuleItemEntity[total]; for (int index = 0; index < total; index++) { factors[index] = new RuleItemEntity() { RuleId = ruleId }; } return factors; } internal static int Factorial(RuleFactorEntity ruleFactors) { return ruleFactors.Tracks.Count* ruleFactors.CargoTypes.Count * ruleFactors.Months.Count * ruleFactors.Areas.Count * ruleFactors.IsTransit.Count * ruleFactors.DeparturePorts.Count * ruleFactors.ProductCodes.Count; } }