using System; using System.Collections.Generic; using System.Linq; namespace wms.service.Help.LayerPacking.model { /// /// 层信息 /// public class LayerPackingLayerInfo { /// /// 层产品 /// public List Products { get; set; } /// /// 层总扭转值 /// public decimal TotalTorsion => Products.Sum(p => p.TorsChkValue); /// /// 层总焊点盘数 /// public int SolderProductCount => Products.Count(p => p.IsSolderProduct); /// /// 层总焊点数 /// public decimal TotalSolderJoints => Products.Sum(p => p.SolderCount); /// /// 层最小目标值 /// public decimal MinLayerTarget { get; set; } /// /// 层最大目标值 /// public decimal MaxLayerTarget { get; set; } /// /// 层去掉最大最小值后的最大标准差 /// private double LayerStandardDeviation = 0.5; /// /// 层目标值 /// public decimal LayerTarget { get; set; } /// /// 构造函数 /// public LayerPackingLayerInfo() { Products = new List(); } /// /// 当前层是否有效 /// /// /// public bool IsValid(LayerPackingConstraints constraints) { var total = TotalTorsion; return total >= constraints.MinLayerTotal && total <= constraints.MaxLayerTotal && LayerStdValid(); } /// /// 获取当前层偏差 /// /// /// public decimal GetDeviationFromTarget(decimal target) { return Math.Abs(TotalTorsion - target); } /// /// 当前层中极值对是否有效 /// /// 大极值阈值 /// 小极值阈值 /// public bool HasValidExtremePair(decimal highThreshold, decimal lowThreshold) { var highCount = Products.Count(p => p.TorsChkValue >= highThreshold); var lowCount = Products.Count(p => p.TorsChkValue <= lowThreshold); return highCount == 0 && lowCount == 0 || highCount == 1 && lowCount == 1; } /// /// 去除最大/最小值后10个产品的标准差≤0.5 /// /// public bool LayerStdValid() { if (Products == null || Products.Count < 3) return true; var ordered = Products.OrderBy(p => p.TorsChkValue).ToList(); var ten = ordered.Skip(1).Take(Products.Count - 2).ToList(); if (ten.Count > 10) { int skip = (ten.Count - 10) / 2; ten = ten.Skip(skip).Take(10).ToList(); } if (ten.Count < 1) return true; double avg = (double)ten.Average(p => p.TorsChkValue); double std = Math.Sqrt(ten.Sum(p => Math.Pow((double)p.TorsChkValue - avg, 2)) / ten.Count); return std <= LayerStandardDeviation; } /// /// 获取层标准差(去除最大最小后10个产品) /// public double GetStdAfterTrim() { if (Products == null || Products.Count < 3) return 0; var ordered = Products.OrderBy(p => p.TorsChkValue).ToList(); var ten = ordered.Skip(1).Take(Products.Count - 2).ToList(); if (ten.Count > 10) { int skip = (ten.Count - 10) / 2; ten = ten.Skip(skip).Take(10).ToList(); } if (ten.Count < 1) return 0; double avg = (double)ten.Average(p => p.TorsChkValue); double std = Math.Sqrt(ten.Sum(p => Math.Pow((double)p.TorsChkValue - avg, 2)) / ten.Count); return std; } } }