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