/// <summary> /// 计算并获取基础的SPC信息变量 /// </summary> /// <param name="source">样本源</param> /// <param name="normal">Spc正常值</param> /// <param name="toleranceSpc">Spc正常值范围</param> /// <param name="basicSpcInfo">传出参数,基本信息对象</param> /// <returns>是否获取成功</returns> private bool GetBasicParam(List <double> source, double normal, double toleranceSpc, out BasicSpcInfo basicSpcInfo) { if (source == null) { basicSpcInfo = null; return(false); } if (source.Count <= 0) { basicSpcInfo = null; return(false); } basicSpcInfo = new BasicSpcInfo(); basicSpcInfo.SampleCount = source.Count; basicSpcInfo.SampleMax = source.Max(); basicSpcInfo.SampleMin = source.Min(); basicSpcInfo.Wrange = Math.Abs(basicSpcInfo.SampleMax - basicSpcInfo.SampleMin); basicSpcInfo.Average = source.Average(); basicSpcInfo.StandardDeviation = CalculateSD(source, basicSpcInfo.Average, basicSpcInfo.SampleCount); basicSpcInfo.Capability = toleranceSpc / 6 / basicSpcInfo.StandardDeviation; basicSpcInfo.Centernal = (toleranceSpc / 2 - Math.Abs(normal - basicSpcInfo.Average)) / 3 / basicSpcInfo.StandardDeviation; int groupQty = 0; groupQty = int.TryParse(Math.Round(Math.Sqrt(basicSpcInfo.SampleCount) + 1, 0, MidpointRounding.AwayFromZero).ToString(), out groupQty) ? groupQty : 0; basicSpcInfo.GroupQty = groupQty; basicSpcInfo.GroupDistance = (basicSpcInfo.SampleMax - basicSpcInfo.SampleMin) / groupQty * 1.0; basicSpcInfo.GroupStartValue = basicSpcInfo.SampleMin - basicSpcInfo.GroupDistance / 2; return(true); }
/// <summary> /// 计算Spc /// </summary> /// <param name="eqmNo">工站编号</param> /// <param name="information">要计算的项目</param> /// <param name="partNo">型号</param> /// <param name="normalValue">该项目的标准值</param> /// <param name="tolerance">该项目的容忍度</param> /// <param name="startTime">开始时间</param> /// <param name="endTime">结束时间</param> /// <returns>返回Spc统计结果</returns> public ModelView.DataAnalysisSpcView CalculateSpc(string eqmNo, string information, string partNo, double normalValue, double tolerance, DateTime startTime, DateTime endTime) { ModelView.DataAnalysisSpcView res = new ModelView.DataAnalysisSpcView(); if (startTime >= endTime) { return(null); } if (string.IsNullOrEmpty(eqmNo)) { return(null); } if (string.IsNullOrEmpty(information)) { return(null); } //获取样本 List <string> tmpListStr = GetInforValueFromDb(eqmNo, information, partNo, startTime, endTime); if (tmpListStr == null) { return(null); } if (tmpListStr.Count <= 0) { return(null); } List <double> sample = ConvertStr2Double(tmpListStr); //样本校验 if (sample == null) { return(null); } if (sample.Count <= 0) { return(null); } BasicSpcInfo basicSpcInfo = new BasicSpcInfo(); //计算基础样本数据 bool b = GetBasicParam(sample, normalValue, tolerance, out basicSpcInfo); if (!b) { return(null); } res.dotTitle = eqmNo + "-" + information + "分析"; res.spcTitle = eqmNo + "-" + information + "分析"; res.avarage = Math.Round(basicSpcInfo.Average, 2); res.max = Math.Round(basicSpcInfo.SampleMax, 2); res.min = Math.Round(basicSpcInfo.SampleMin, 2); res.normal = Math.Round(normalValue, 2); res.upLimit = Math.Round(normalValue + tolerance / 2, 2); res.lowerLimit = Math.Round(normalValue - tolerance / 2, 2); res.yAxisMax = Math.Max(Math.Round(res.max + Math.Abs((res.max - res.min) * 0.2), 2), Math.Round(res.upLimit + Math.Abs((res.max - res.min) * 0.2), 2)); res.yAxisMin = Math.Min(Math.Round(res.min - Math.Abs((res.max - res.min) * 0.2), 2), Math.Round(res.lowerLimit - Math.Abs((res.max - res.min) * 0.2), 2)); res.dotxAxisData = CreateSampleIndex(sample); List <double> sampleRound = new List <double>(); sample.ForEach(a => sampleRound.Add(Math.Round(a, 2))); res.dotyAxisData = sampleRound; res.spcxAxisData = CreateSpcBasicData(res.min, res.max, basicSpcInfo.GroupDistance); res.tips = string.Format("CP:{0}\t\tCPK:{1}", (Math.Round(basicSpcInfo.Capability, 2).ToString()), (Math.Round(basicSpcInfo.Centernal, 2).ToString())); List <BasicSpcInfo.Boundary> sampleGroupBoundary = CalculateBoundary(basicSpcInfo.GroupStartValue, res.max, basicSpcInfo.GroupDistance); if (sampleGroupBoundary == null) { return(null); } if (sampleGroupBoundary.Count <= 0) { return(null); } Dictionary <BasicSpcInfo.Boundary, int> firstStatistic = StatictisSample(sample, sampleGroupBoundary); if (firstStatistic == null) { return(null); } if (firstStatistic.Count <= 0) { return(null); } res.spcyAxisCountData = StatisticSampleCount(firstStatistic); res.spcyAxisCurveData = CalculateBasicDataNormal(res.spcxAxisData, basicSpcInfo.Average, basicSpcInfo.StandardDeviation, basicSpcInfo.GroupDistance, basicSpcInfo.SampleCount); return(res); }