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