LayerPackingLayerInfo.cs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. namespace wms.service.Help.LayerPacking.model
  5. {
  6. /// <summary>
  7. /// 层信息
  8. /// </summary>
  9. public class LayerPackingLayerInfo
  10. {
  11. /// <summary>
  12. /// 层产品
  13. /// </summary>
  14. public List<LayerPackingProduct> Products { get; set; }
  15. /// <summary>
  16. /// 层总扭转值
  17. /// </summary>
  18. public decimal TotalTorsion => Products.Sum(p => p.TorsChkValue);
  19. /// <summary>
  20. /// 层总焊点盘数
  21. /// </summary>
  22. public int SolderProductCount => Products.Count(p => p.IsSolderProduct);
  23. /// <summary>
  24. /// 层总焊点数
  25. /// </summary>
  26. public decimal TotalSolderJoints => Products.Sum(p => p.SolderCount);
  27. /// <summary>
  28. /// 层最小目标值
  29. /// </summary>
  30. public decimal MinLayerTarget { get; set; }
  31. /// <summary>
  32. /// 层最大目标值
  33. /// </summary>
  34. public decimal MaxLayerTarget { get; set; }
  35. /// <summary>
  36. /// 层去掉最大最小值后的最大标准差
  37. /// </summary>
  38. private double LayerStandardDeviation = 0.5;
  39. /// <summary>
  40. /// 层目标值
  41. /// </summary>
  42. public decimal LayerTarget { get; set; }
  43. /// <summary>
  44. /// 构造函数
  45. /// </summary>
  46. public LayerPackingLayerInfo()
  47. {
  48. Products = new List<LayerPackingProduct>();
  49. }
  50. /// <summary>
  51. /// 当前层是否有效
  52. /// </summary>
  53. /// <param name="constraints"></param>
  54. /// <returns></returns>
  55. public bool IsValid(LayerPackingConstraints constraints)
  56. {
  57. var total = TotalTorsion;
  58. return total >= constraints.MinLayerTotal && total <= constraints.MaxLayerTotal && LayerStdValid();
  59. }
  60. /// <summary>
  61. /// 获取当前层偏差
  62. /// </summary>
  63. /// <param name="target"></param>
  64. /// <returns></returns>
  65. public decimal GetDeviationFromTarget(decimal target)
  66. {
  67. return Math.Abs(TotalTorsion - target);
  68. }
  69. /// <summary>
  70. /// 当前层中极值对是否有效
  71. /// </summary>
  72. /// <param name="highThreshold">大极值阈值</param>
  73. /// <param name="lowThreshold">小极值阈值</param>
  74. /// <returns></returns>
  75. public bool HasValidExtremePair(decimal highThreshold, decimal lowThreshold)
  76. {
  77. var highCount = Products.Count(p => p.TorsChkValue >= highThreshold);
  78. var lowCount = Products.Count(p => p.TorsChkValue <= lowThreshold);
  79. return highCount == 0 && lowCount == 0 || highCount == 1 && lowCount == 1;
  80. }
  81. /// <summary>
  82. /// 去除最大/最小值后10个产品的标准差≤0.5
  83. /// </summary>
  84. /// <returns></returns>
  85. public bool LayerStdValid()
  86. {
  87. if (Products == null || Products.Count < 3) return true;
  88. var ordered = Products.OrderBy(p => p.TorsChkValue).ToList();
  89. var ten = ordered.Skip(1).Take(Products.Count - 2).ToList();
  90. if (ten.Count > 10)
  91. {
  92. int skip = (ten.Count - 10) / 2;
  93. ten = ten.Skip(skip).Take(10).ToList();
  94. }
  95. if (ten.Count < 1) return true;
  96. double avg = (double)ten.Average(p => p.TorsChkValue);
  97. double std = Math.Sqrt(ten.Sum(p => Math.Pow((double)p.TorsChkValue - avg, 2)) / ten.Count);
  98. return std <= LayerStandardDeviation;
  99. }
  100. /// <summary>
  101. /// 获取层标准差(去除最大最小后10个产品)
  102. /// </summary>
  103. public double GetStdAfterTrim()
  104. {
  105. if (Products == null || Products.Count < 3) return 0;
  106. var ordered = Products.OrderBy(p => p.TorsChkValue).ToList();
  107. var ten = ordered.Skip(1).Take(Products.Count - 2).ToList();
  108. if (ten.Count > 10)
  109. {
  110. int skip = (ten.Count - 10) / 2;
  111. ten = ten.Skip(skip).Take(10).ToList();
  112. }
  113. if (ten.Count < 1) return 0;
  114. double avg = (double)ten.Average(p => p.TorsChkValue);
  115. double std = Math.Sqrt(ten.Sum(p => Math.Pow((double)p.TorsChkValue - avg, 2)) / ten.Count);
  116. return std;
  117. }
  118. }
  119. }