using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using System.Xml; using Pcb.Common.Config; namespace Pcb.Common { public class PcbQutoConfigHeler { //优品出货报告列表 public readonly static string[] REPORTLIST = {"常规默认出货报告","切片报告","测试报告","RoHS元素分析报告","可焊性实验报告" }; public static string GetDropDownList() { var r1 = new StringBuilder(); var allClass = typeof(PcbQutoConfig).GetMembers().Where(i => i.MemberType == MemberTypes.NestedType).ToList(); allClass.ForEach(x => { var dd = x.DeclaringType.FullName + "+" + x.Name; var list = Type.GetType(dd, true, true).GetFields().Where(i => i.MemberType == MemberTypes.Field).ToList(); list.ForEach(z => { var val = z.GetValue(null); r1.Append(""); }); }); return r1.ToString(); } public static List> GetAllList() { var r1 = new List>();//三元:组,标识,值,即类名,字段名,字段值 var allClass = typeof(PcbQutoConfig).GetMembers().Where(i => i.MemberType == MemberTypes.NestedType).ToList(); allClass.ForEach(x => { var dd = x.DeclaringType.FullName + "+" + x.Name; var list = Type.GetType(dd, true, true).GetFields().Where(i => i.MemberType == MemberTypes.Field).ToList(); list.ForEach(z => { var val = z.GetValue(null); r1.Add(new Tuple(x.Name, z.Name, val.ToString())); }); }); return r1; } #region 读取配置 /// /// 获取所有pcb参数配置 /// /// public static Dictionary>[] GetConfigs() { var cfgs = new Dictionary>[3]; cfgs[0] = GetBusinessTypes(); cfgs[1] = GetFactoryTypes(); cfgs[2] = GetOutFactoryTypes(); return cfgs; } /// /// 读取指定Pcb参数配置(0-业务,1-生产,2-外发) /// public static Dictionary> GetTypes(int ConfigId) { switch (ConfigId) { case 0: return GetBusinessTypes(); case 1: return GetFactoryTypes(); case 2: return GetOutFactoryTypes(); default: return new Dictionary>(); } } /// /// 读取业务Pcb参数配置(标品) /// public static Dictionary> GetBusinessTypes() { return GetConfig("/ConfigFiles/PcbQuoteConfig.xml"); } /// /// 读取业务Pcb参数配置(优品) /// public static Dictionary> GetBusinessYpTypes() { return GetConfig("/ConfigFiles/PcbQuoteYpConfig.xml"); } /// /// 读取生产Pcb参数配置 /// public static Dictionary> GetFactoryTypes() { return GetConfig("/ConfigFiles/ProOrderConfig.xml"); } /// /// 读取外发Pcb参数配置 /// public static Dictionary> GetOutFactoryTypes() { return GetConfig("/ConfigFiles/OutFactoryPcbQuoteConfig.xml"); } /// /// 读取Smt供应商参数配置 /// public static Dictionary> GetSmtSupplyTypes() { return GetConfig("/ConfigFiles/SmtSupplyConfig.xml"); } /// /// 读取pcb协同供应商参数配置 /// public static Dictionary> GetPcbJoinTypes() { return GetConfig("/ConfigFiles/JoinFactoryConfig.xml"); } /// /// 读取Pcb参数类型 /// public static Dictionary GetItems(int ConfigId, string TypeName) { var dic = GetTypes(ConfigId); return GetItems(dic, TypeName); } /// /// 读取Pcb参数类型 /// public static Dictionary GetItems(Dictionary> Types, string TypeName) { Dictionary items; return Types.TryGetValue(TypeName, out items) ? items : new Dictionary { }; } /// /// 读取Pcb参数中文名 /// public static string GetCn(Dictionary> Types, string TypeName, string Value) { var dic = GetItems(Types, TypeName); return GetCn(dic, Value); } /// /// 读取Pcb参数中文名 /// public static string GetCn(int ConfigTypeId, string TypeName, string Value) { var dic = GetItems(ConfigTypeId, TypeName); return GetCn(dic, Value); } /// /// 读取Pcb参数中文名 /// public static string GetCn(Dictionary ItemDic, string Value) { string name; return ItemDic.TryGetValue(Value, out name) ? name : string.Empty; } /// /// 读取Pcb参数配置 /// public static Dictionary> GetConfig(string FileName) { var dic = new Dictionary>(); try { var listDis = XmlHelper.ReadChildList(FileName, "/Lists").Where(x => x.NodeType.ToString() == XmlNodeType.Element.ToString()); var chlids = listDis; foreach (System.Xml.XmlNode xn in chlids) { var key = xn.Attributes.GetNamedItem("name").Value; var value = new Dictionary(); foreach (System.Xml.XmlNode subxn in xn.ChildNodes) { var subkey = subxn.Attributes.GetNamedItem("value").Value; var subvalue = subxn.InnerText; value.Add(subkey, subvalue); } dic.Add(key, value); } } catch (Exception ex) { LogHelper.Error(ex.ToString()); } return dic; } public static string SmtSupplyInfo(string TypeName, int SupplyId) { return PcbQutoConfigHeler.GetCn(PcbQutoConfigHeler.GetSmtSupplyTypes(), TypeName, SupplyId.ToString()); } #endregion /// 获取计价配置的参数项目 /// /// /// /// /// public static Dictionary> GetPcbQuoteConfig(string name, string FileName = "/ConfigFiles/PcbQuoteConfig.xml") { var dic = new Dictionary>(); try { var listDis = XmlHelper.ReadChildList(FileName, "/Lists").Where(x => x.NodeType.ToString() == XmlNodeType.Element.ToString()); var chlids = listDis; foreach (System.Xml.XmlNode xn in chlids) { var key = xn.Attributes.GetNamedItem("name").Value; var value = new Dictionary(); foreach (System.Xml.XmlNode subxn in xn.ChildNodes) { var subkey = subxn.Attributes.GetNamedItem("value").Value; var subvalue = subxn.InnerText; value.Add(subkey, subvalue); } dic.Add(key, value); } } catch (Exception ex) { LogHelper.Error(ex.ToString()); } if (!string.IsNullOrWhiteSpace(name)) { dic = dic.Where(x => x.Key == name).ToDictionary(x => x.Key, y => y.Value); } return dic; } /// /// 获取标品配价的参数的中文值 /// /// /// /// public static string GetPcbQuoteConfigValueByKey(string name, string key) { var val = ""; var kp = GetPcbQuoteConfig(name).FirstOrDefault(); if (kp.Value == null) { return val; } var dic = kp.Value; if (dic.Count > 0 && !string.IsNullOrWhiteSpace(key)) dic.TryGetValue(key, out val); return val; } /// /// 获取优品配价的参数的中文值 /// /// /// /// public static string GetPcbQuoteConfigYpValueByKey(string name,string key) { var val = ""; var kp = GetPcbQuoteConfig(name, "/ConfigFiles/PcbQuoteYpConfig.xml").FirstOrDefault(); if (kp.Value == null) { return val; } var dic = kp.Value; if (dic.Count > 0 && !string.IsNullOrWhiteSpace(key)) dic.TryGetValue(key, out val); return val; } /// /// 获取优品的出货报告值列表 /// /// /// public static string GetYpReportByValue(string reportlist) { string[] reports = reportlist.Split(','); if(reports.Length!= REPORTLIST.Length) { return ""; } else { string result = ""; for(var i = 0; i < REPORTLIST.Length; i++) { if (reports[i].ToInt2() == 1) { result += REPORTLIST[i] + ","; } } if (!string.IsNullOrEmpty(result)) { result = result.Substring(0, result.Length - 1); } return result; } } /// /// 获取标品报价的单价和工程费 /// /// /// /// /// /// public static Tuple GetPcbQuotePrice(double coorThinchness, double innerCoorThinckness, int layer, double boardThinckness, bool isYang) { var gcf = 0m; var dj = 0m; try { var listDis = XmlHelper.ReadChildList("/ConfigFiles/PcbQuotePriceConfig.xml", "/Lists").Where(x => x.NodeType.ToString() == XmlNodeType.Element.ToString()); var chlids = listDis; foreach (System.Xml.XmlNode xnLayer in chlids) { var key = xnLayer.Attributes.GetNamedItem("name").Value.ToInt2(); if (key == layer) { foreach (System.Xml.XmlNode xnCoor in xnLayer.ChildNodes) { var outer = xnCoor.Attributes.GetNamedItem("outer").Value.ToDouble(); var inner = xnCoor.Attributes.GetNamedItem("inner").Value.ToDouble(); if (outer == coorThinchness && inner == innerCoorThinckness) { foreach (System.Xml.XmlNode xnBoard in xnCoor.ChildNodes) { var min = xnBoard.Attributes.GetNamedItem("min").Value.ToDouble(); var max = xnBoard.Attributes.GetNamedItem("max").Value.ToDouble(); if (boardThinckness >= min && boardThinckness <= max) { var yangname = "yang"; if (!isYang) yangname = "batch"; gcf = xnBoard.Attributes.GetNamedItem(yangname + "gcf").Value.ToDecimal(); dj = xnBoard.Attributes.GetNamedItem(yangname + "dj").Value.ToDecimal(); break; } } break; } } break; } } } catch (Exception ex) { LogHelper.Error(ex.ToString()); } return new Tuple(gcf, dj); } /// /// 获取优品报价的单价和工程费 /// /// /// /// /// /// public static Tuple GetPcbQuotePriceYp(double coorThinchness, double innerCoorThinckness, int layer, double boardThinckness, bool isYang) { var gcf = 0m; var dj = 0m; try { var listDis = XmlHelper.ReadChildList("/ConfigFiles/PcbQuotePriceYpConfig.xml", "/Lists").Where(x => x.NodeType.ToString() == XmlNodeType.Element.ToString()); var chlids = listDis; foreach (System.Xml.XmlNode xnLayer in chlids) { var key = xnLayer.Attributes.GetNamedItem("name").Value.ToInt2(); if (key == layer) { foreach (System.Xml.XmlNode xnCoor in xnLayer.ChildNodes) { var outer = xnCoor.Attributes.GetNamedItem("outer").Value.ToDouble(); var inner = xnCoor.Attributes.GetNamedItem("inner").Value.ToDouble(); if (outer == coorThinchness && inner == innerCoorThinckness) { foreach (System.Xml.XmlNode xnBoard in xnCoor.ChildNodes) { var min = xnBoard.Attributes.GetNamedItem("min").Value.ToDouble(); var max = xnBoard.Attributes.GetNamedItem("max").Value.ToDouble(); if (boardThinckness >= min && boardThinckness <= max) { var yangname = "yang"; if (!isYang) yangname = "batch"; gcf = xnBoard.Attributes.GetNamedItem(yangname + "gcf").Value.ToDecimal(); dj = xnBoard.Attributes.GetNamedItem(yangname + "dj").Value.ToDecimal(); break; } } break; } } break; } } } catch (Exception ex) { LogHelper.Error(ex.ToString()); } return new Tuple(gcf, dj); } /// /// 获取铝基板的报价的单价和工程费 /// /// /// /// /// /// public static Tuple GetAluminumQuotePrice(double invoice, double boardThinckness, bool isYang) { var gcf = 0m; var dj = 0m; try { var listDis = XmlHelper.ReadChildList("/ConfigFiles/AluminumQuotePriceConfig.xml", "/Lists").Where(x => x.NodeType.ToString() == XmlNodeType.Element.ToString()); var chlids = listDis; foreach (System.Xml.XmlNode xnLayer in chlids) { var key = xnLayer.Attributes.GetNamedItem("name").Value.ToDouble(); if (key == invoice) { foreach (System.Xml.XmlNode xnBoard in xnLayer.ChildNodes) { var min = xnBoard.Attributes.GetNamedItem("min").Value.ToDouble(); var max = xnBoard.Attributes.GetNamedItem("max").Value.ToDouble(); if (boardThinckness >= min && boardThinckness <= max) { var yangname = "yang"; if (!isYang) yangname = "batch"; gcf = xnBoard.Attributes.GetNamedItem(yangname + "gcf").Value.ToDecimal(); dj = xnBoard.Attributes.GetNamedItem(yangname + "dj").Value.ToDecimal(); break; } } break; } } } catch (Exception ex) { LogHelper.Error(ex.ToString()); } return new Tuple(gcf, dj); } /// /// 获取国纪板材的报价的单价和工程费 /// /// /// /// /// /// public static Tuple GetGJQuotePrice(double coorThinchness, double innerCoorThinckness, int layer, double boardThinckness, bool isYang) { var gcf = 0m; var dj = 0m; try { var listDis = XmlHelper.ReadChildList("/ConfigFiles/PcbQuoteGJPriceConfig.xml", "/Lists").Where(x => x.NodeType.ToString() == XmlNodeType.Element.ToString()); var chlids = listDis; foreach (System.Xml.XmlNode xnLayer in chlids) { var key = xnLayer.Attributes.GetNamedItem("name").Value.ToInt2(); if (key == layer) { foreach (System.Xml.XmlNode xnCoor in xnLayer.ChildNodes) { var outer = xnCoor.Attributes.GetNamedItem("outer").Value.ToDouble(); var inner = xnCoor.Attributes.GetNamedItem("inner").Value.ToDouble(); if (outer == coorThinchness) { foreach (System.Xml.XmlNode xnBoard in xnCoor.ChildNodes) { var min = xnBoard.Attributes.GetNamedItem("min").Value.ToDouble(); var max = xnBoard.Attributes.GetNamedItem("max").Value.ToDouble(); if (boardThinckness >= min && boardThinckness <= max) { var yangname = "yang"; if (!isYang) yangname = "batch"; gcf = xnBoard.Attributes.GetNamedItem(yangname + "gcf").Value.ToDecimal(); dj = xnBoard.Attributes.GetNamedItem(yangname + "dj").Value.ToDecimal(); break; } } break; } } break; } } } catch (Exception ex) { LogHelper.Error(ex.ToString()); } return new Tuple(gcf, dj); } /// /// 获取工序工资计算表 /// /// /// /// public static string GetProSalaryConfig(string stepkey, string searchdate) { var val = string.Empty; try { var listDics = XmlHelper.ReadChildList("/ConfigFiles/ProSalaryConfig.xml", "/Lists").Where(x => x.NodeType.ToString() == XmlNodeType.Element.ToString()); var chlids = listDics; foreach (System.Xml.XmlNode xnkey in chlids) { var key = xnkey.Attributes.GetNamedItem("key").Value; if (key == stepkey) { foreach (System.Xml.XmlNode xn in xnkey.ChildNodes) { var date = xn.Attributes.GetNamedItem("date").Value; if (date == searchdate) { val = xn.Attributes.GetNamedItem("value").Value; } } } } } catch (Exception ex) { LogHelper.Error(ex.ToString()); } return val; } /// /// 获取生产系统的参数项目 /// /// 配置参数名 /// 配置文件名 /// public static Dictionary> GetProOrderConfig(string name, int pinbantype=0,string fullFileName = "/ConfigFiles/ProOrderConfig.xml") { if(pinbantype > 0) { fullFileName = "/ConfigFiles/ProOrderConfigFactory.xml"; } var dic = new Dictionary>(); try { var listDis = XmlHelper.ReadChildList(fullFileName, "/Lists").Where(x => x.NodeType.ToString() == XmlNodeType.Element.ToString()); var chlids = listDis; foreach (System.Xml.XmlNode xn in chlids) { var key = xn.Attributes.GetNamedItem("name").Value; var value = new Dictionary(); foreach (System.Xml.XmlNode subxn in xn.ChildNodes) { var subkey = subxn.Attributes.GetNamedItem("value").Value; var subvalue = subxn.InnerText; value.Add(subkey, subvalue); } dic.Add(key, value); } } catch (Exception ex) { LogHelper.Error(ex.ToString()); } if (!string.IsNullOrWhiteSpace(name)) { dic = dic.Where(x => x.Key == name).ToDictionary(x => x.Key, y => y.Value); } return dic; } /// /// 获取配价的参数的中文值 /// /// /// /// public static string GetProOrderConfigValueByKey(string name, string key,int pinbantype=0) { if (string.IsNullOrEmpty(key)) { return string.Empty; } var dic = GetProOrderConfig(name, pinbantype).FirstOrDefault().Value; if (dic == null || dic.Count == 0) { return string.Empty; } var val = ""; dic.TryGetValue(key, out val); if (string.IsNullOrWhiteSpace(val)) val = key;//获取不到时,取默认值 return val; } /// /// 获取面积 /// /// /// /// /// /// /// /// public static double GetArea(string boadType, int num, double l, double w, string pinbantype = "", string gyb = "") { var area = 0d; if (boadType == "pcs") { area = Math.Round(l * w * num / 10000, 2); } else { if (string.IsNullOrWhiteSpace(pinbantype)) { pinbantype = "1x1"; } if (string.IsNullOrWhiteSpace(gyb)) { gyb = "none:0"; } var gcf = 0m; var dj = 0m; var finaldj = 0m; var m2 = StringHelper.GetM2(l, w, num); if (boadType == "jpset") { var pp = pinbantype.Split('x'); var bb = gyb.Split(':'); var sxgyb = 0d; var zygyb = 0d; if (bb[0] == "updown") { sxgyb = bb[1].ToDouble(0) * 2; } if (bb[0] == "leftright") { zygyb = bb[1].ToDouble(0) * 2; } if (bb[0] == "both") { sxgyb = bb[1].ToDouble(0) * 2; zygyb = bb[1].ToDouble(0) * 2; } var newsets = num / (pp[0].ToInt(1) * pp[1].ToInt(1)); m2 += (sxgyb * w * pp[1].ToInt(1).Value + zygyb * l * pp[0].ToInt(1).Value) * newsets.Value / 1000000; } area = m2; } return area; } } }