/// <summary> /// 生成材料规格 /// </summary> /// <param name="partNumber">品号</param> /// <returns></returns> public string GenerateMaterialSpec(string partNumber) { MaterialSpecItemEntity entity = new MaterialSpecItemEntity(); #region 筛选出对应MaterialSpec.xml的配置公式 Dictionary <string, List <MaterialSpecItemEntity> > dicTask = new Dictionary <string, List <MaterialSpecItemEntity> >(); XDocument xdc = XDocument.Load(@"./Xml/MaterialSpec.xml"); //匹配前3码 var partNumberStarts = from item in xdc.Descendants("partNumberStart") where Regex.Match(partNumber, item.Attribute("value").Value).Success select item; XElement partNumberStart = partNumberStarts.FirstOrDefault(); if (partNumberStart == null) { errorHandler(2, partNumber + "没有找到对应的材料规格生成规则"); return(string.Empty); } //匹配品号是否满足 var partNumberXml = from item in partNumberStart.Descendants("partNumber") where Regex.Match(partNumber, item.Attribute("value").Value).Success select item; if (partNumberXml == null) { errorHandler(2, partNumber + "没有找到对应的材料规格生成规则"); return(string.Empty); } //匹配对应的Item公式 var node = from item in partNumberXml.Descendants("Item") select item; if (node == null) { errorHandler(2, partNumber + "没有找到对应的材料规格生成规则"); return(string.Empty); } foreach (XElement item in node.ToList()) { entity.PartNumber = partNumber; entity.ErrorNumber = Convert.ToInt32(GetNoteAttributeValues(item, "ErrorNumber")); entity.ErrorValue = GetNoteAttributeValues(item, "ErrorValue"); entity.BaseValue = GetNoteAttributeValues(item, "BaseValue"); entity.LowValue = GetNoteAttributeValues(item, "LowValue"); entity.MaxValue = GetNoteAttributeValues(item, "MaxValue"); entity.Unit = GetNoteAttributeValues(item, "Unit"); break; } #endregion #region 根据公式,得到材料规格 return(GenerateMaterialSpecByEntity(entity)); #endregion }
/// <summary> /// 根据实体类,算出对应的材料规格 /// </summary> /// <param name="entity"></param> /// <returns></returns> public string GenerateMaterialSpecByEntity(MaterialSpecItemEntity entity) { string partNumber = entity.PartNumber; //品号 string singleNumberText = partNumber.Substring(entity.ErrorNumber - 1, 1); //截取的字符值 string unit = string.Empty; //单位 string[] strErrValue = entity.ErrorValue.Split(','); Dictionary <string, string> dicErrValue = new Dictionary <string, string>(); foreach (string s in strErrValue) { string[] strTemp = s.Trim().Split('='); if (strTemp.Length != 2) { continue; } if (!dicErrValue.ContainsKey(strTemp[0])) { dicErrValue.Add(strTemp[0], strTemp[1]); } } if (!dicErrValue.ContainsKey(singleNumberText)) { return(""); } string errorValue = dicErrValue[singleNumberText];//误差值 //品号的替换对应Dictionary(如:A->1;B->a......) Dictionary <string, string> dicFormalReplace = GetFormalDictionary(partNumber); //计算基值 string baseValue = ComputeValueByFormula(dicFormalReplace, entity.BaseValue); //为了计算负值和正值,要将误差值和基值放到替换Dictionary里面 dicFormalReplace.Add("P", errorValue); dicFormalReplace.Add("Q", baseValue); //负值 string lowValue = ComputeValueByFormula(dicFormalReplace, entity.LowValue); //正值 string maxValue = ComputeValueByFormula(dicFormalReplace, entity.MaxValue); //单位 string[] unitStr = entity.Unit.Split(','); /*长度处理(以正值的长度为准, * (1),0~3位,不用除1000(默认单位OHM); * (2),4~6,除以1次1000(K OHM); * (3),7以上,除以2次1000(M OHM))*/ if (Convert.ToDouble(maxValue) >= Math.Pow(10, 3) && Convert.ToDouble(maxValue) < Math.Pow(10, 7)) { lowValue = (Convert.ToDouble(lowValue) / Math.Pow(10, 3)).ToString("0.##"); maxValue = (Convert.ToDouble(maxValue) / Math.Pow(10, 3)).ToString("0.##"); unit = unitStr.Length >= 3 ? unitStr[1] : unitStr[0]; } else if (Convert.ToDouble(maxValue) >= Math.Pow(10, 7)) { lowValue = (Convert.ToDouble(lowValue) / Math.Pow(10, 6)).ToString("0.##"); maxValue = (Convert.ToDouble(maxValue) / Math.Pow(10, 6)).ToString("0.##"); unit = unitStr.Length >= 3 ? unitStr[2] : unitStr[0]; } else { lowValue = Convert.ToDouble(lowValue).ToString("0.##"); maxValue = Convert.ToDouble(maxValue).ToString("0.##"); unit = unitStr[0]; } return(lowValue + "~" + maxValue + unit); }