using System; using System.Collections.Generic; using System.Linq; using System.Text; using CoreFS.CA06; using System.Data; using System.Collections; using Core.Mes.Client.Common; using Core.LgMes.Client.lgClassModel.LgChem; using Core.LgMes.Client.lgClassModel.SqModel; using Core.LgMes.Client.lgServiceMgt; using System.Text.RegularExpressions; namespace Core.LgMes.Client.lgBll.LgChemeLementMgt { public class LgChemeLementMgt { private static Core.LgMes.Client.lgServiceMgt.SqMesService.Tbb01FacIngrService tbb01FacIngrService = new Core.LgMes.Client.lgServiceMgt.SqMesService.Tbb01FacIngrService(); private static Core.LgMes.Client.lgServiceMgt.LgChemeLementService.LgChemeLementService chemservice = new Core.LgMes.Client.lgServiceMgt.LgChemeLementService.LgChemeLementService(); private static Core.LgMes.Client.lgServiceMgt.SqMesService.Tbb01SeqIngrService seqingrservice = new Core.LgMes.Client.lgServiceMgt.SqMesService.Tbb01SeqIngrService(); /// /// 从三期获取成分标准,按2.5级限定格式 /// 2.5级中的成分标准也是从三期下来的,带炉号信息 /// 导致如果一炉的牌号后续如果判定变化,现有的方式不能支持显示变化后的牌号成分信息 /// /// /// public static DataSet ReturnChemStandInfo(ClientParamWithSqlConditionAndOpenBase param) { return tbb01FacIngrService.ReturStandSteelChemeBySteelCode(param); } /// /// 获取成分修约数据 /// /// /// public static List GetTbb01SeqIngrAll(ClientParamWithSqlConditionAndOpenBase param) { return TBB01_SEQ_INGR.GetTbb01SeqIngrByDataSet(seqingrservice.ReturnDsTbb01SeqIngr(param)); } /// /// 通过成分名称从修约中查找 /// /// /// /// public static TBB01_SEQ_INGR GetTbb01SeqIngrByChecmCd(List list, string chemCd) { TBB01_SEQ_INGR igr = null; if(list == null || list.Count == 0) { return igr; } foreach(TBB01_SEQ_INGR ingr in list) { if(ingr.CHEM_CD.ToUpper() == chemCd.ToUpper()) { igr = ingr; break; } } return igr; } /// /// 炼钢放行标准 /// /// /// public static List GetTbb01TafacIngrBySteelName(ClientParamWithSqlConditionAndOpenBase param) { return TBB01_TAFAC_INGR.GetTbb01TafacIngrByDataSet(tbb01FacIngrService.ReturnDsTbb01TaFacIngr(param)); } /// /// 炼钢放行标准 ,自定义查询条件 /// /// /// public static List GetTbb01TafacIngrBySteelCodeList(ClientParamWithSqlConditionAndOpenBase param) { ArrayList listSteelcode = param.param[0] as ArrayList; string sqlConditon = ""; foreach(string s in listSteelcode) { sqlConditon += string.Format(" tafac_stl_grd = '{0}' or ", s); } sqlConditon = " and (" + sqlConditon + " 1 = 2" + ")"; ClientParamWithSqlConditionAndOpenBase param01 = new ClientParamWithSqlConditionAndOpenBase(sqlConditon, param.ob); return TBB01_TAFAC_INGR.GetTbb01TafacIngrByDataSet(tbb01FacIngrService.ReturnDsTbb01TaFacIngrWithConditon(param01)); } public static DataSet GetCeqChem(ClientParamWithSqlConditionAndOpenBase param) { return chemservice.ReturnDsOfChemeCeq(param); } /// /// 根据炉号和化验时间找到其对应的复合元素,并组合成hashtable返回 /// /// /// public static Hashtable ReturnCeqChemByHeatNoAndAssDate(ClientParamWithSqlConditionAndOpenBase param) { Hashtable hashreturn = null; try { Hashtable hsCeq = null; hashreturn = new Hashtable(); // 获取复合元素集合 DataTable dt = param.param[2] as DataTable; if(dt != null && dt.Rows.Count > 0) { hsCeq = new Hashtable(); // 将复合元素存入hash foreach(DataRow dr in dt.Rows) { try { hsCeq.Add(dr["CHEM_CD"].ToString(), dr["CHEM_VALUE"].ToString()); } catch { } } // 将结果返回 hashreturn.Add(param.param[0].ToString() + param.param[1].ToString(), hsCeq); } } catch { } return hashreturn; } /// /// 将形如格式=C+Si/30+Mn/20+Cu/20+Ni/60+Cr/20+Mo/15+V/10+5*B 分解复合要求的串,并放到数据库执行 /// /// /// /// private static string ConvertCalChemToMathRound(string strin, string chem_cd, List listIngr) { //=C+Si/30+Mn/20+Cu/20+Ni/60+Cr/20+Mo/15+V/10+5*B string partten = @"[^A-Za-z0-9]"; // 替换所有非字符 ArrayList list = new ArrayList(); char[] strinTemp = strin.Replace("=", "").ToCharArray(); string temp = ""; int idxLeft = 0; int idxRight = 0; for(int i = 0; i < strinTemp.Length; i = i + idxRight) { // 非字符,直接填写 temp = strinTemp[i].ToString(); idxLeft = i; idxRight = 1; if(Regex.Replace(strinTemp[i].ToString(), partten, "").Length != strinTemp[i].ToString().Length) { list.Add(temp); } else { // 如果是Cu 等,往后找最多10位,并标记步长 // 单一元素不考虑数字的 for(int j = idxLeft + 1; j < idxLeft + 10; j++) { try { if(Regex.Replace(strinTemp[j].ToString(), partten, "").Length == strinTemp[j].ToString().Length) { // 如果都是字符 temp = temp + strinTemp[j].ToString(); idxRight++; } else break; } catch { } } try { // 应用数据库函数round_math if(Regex.Replace(temp, @"[^A-Za-z]", "").Length == temp.Length) { list.Add("round_math" + "(" + temp + "," + "'" + 1 / Convert.ToDouble(GetTbb01SeqIngrByChecmCd(listIngr, temp).DISPLAY_LEN) + "'" + ")"); } else list.Add(temp); } catch { } } } // 组合成一个串 string ret = ""; foreach(string s in list) { ret += s; } // 对复合元素也要应用修约 ret = "round_math(substr(" + ret + ",1,6" + ")" + "," + "'" + 1 / Convert.ToDouble(GetTbb01SeqIngrByChecmCd(listIngr, chem_cd).DISPLAY_LEN) + "'" + ")"; return ret; } /// /// 获取所有的复和成分元素列表 /// /// public static ArrayList GetAllCeqChemByUpperChar(ClientParamWithSqlConditionAndOpenBase param) { ArrayList list = new ArrayList(); List listSeq = GetTbb01SeqIngrAll(param); if(listSeq == null && listSeq.Count == 0) return null; foreach(TBB01_SEQ_INGR ingr in listSeq) { if(ingr.COMP_YN == "Y") list.Add(ingr.CHEM_CD.ToUpper()); } return list; } /// /// 获取修约的复合成分元素以及计算方法,并组合成hashtable /// /// /// public static Hashtable GetAllCeqChemAndValueByUpperChar(ClientParamWithSqlConditionAndOpenBase param) { Hashtable hs = new Hashtable(); List listSeq = GetTbb01SeqIngrAll(param); if(listSeq == null && listSeq.Count == 0) return null; foreach(TBB01_SEQ_INGR ingr in listSeq) { if(ingr.COMP_YN == "Y") hs.Add(ingr.CHEM_CD.ToUpper(), ingr.COMP_CAL); } return hs; } /// /// 获取一个牌号对应的复合成分 /// /// /// public static ArrayList GetCeqBySteelCode(ClientParamWithSqlConditionAndOpenBase param) { ArrayList listCeq = new ArrayList(); try { string steelCode = param.sqlCondition; List listTafac = GetTbb01TafacIngrBySteelName(new ClientParamWithSqlConditionAndOpenBase(steelCode, param.ob)); if(listTafac != null && listTafac.Count > 0) { foreach(TBB01_TAFAC_INGR tbbt in listTafac) { if(tbbt.COMP_YN == "Y") listCeq.Add(tbbt.CHEM_CD); } } } catch { } return listCeq; } /// /// /// /// /// public static ArrayList GetCeqBySteelCode(string steelCode, List listTafac) { ArrayList listCeq = new ArrayList(); try { if(listTafac != null && listTafac.Count > 0) { foreach(TBB01_TAFAC_INGR tbbt in listTafac) { if(tbbt.TAFAC_STL_GRD == steelCode) { if(tbbt.COMP_YN == "Y") listCeq.Add(tbbt.CHEM_CD); } } } } catch { } return listCeq; } /// /// 扫描每天成分数据,并计算复合成分,写入表stl_chemelement_ceq /// /// public static void Insert_StlChemelementCeq(ClientParamWithSqlConditionAndOpenBase param) { // 获取所有复合成分元素 try { string steelCode = ""; ClientParamWithSqlConditionAndOpenBase param01 = null; List listSeq = GetTbb01SeqIngrAll(param); Hashtable hsChemList = GetAllCeqChemAndValueByUpperChar(param); List listTafac = null; ArrayList listsel = null; ArrayList listselCode = new ArrayList(); string startDate = string.Format(" and assaydate >= to_date('{0}','yyyy-mm-dd hh24:mi:ss') - 1 ", param.param[0].ToString()); string endDate = string.Format(" and assaydate < to_date('{0}','yyyy-mm-dd hh24:mi:ss') + 1 ", param.param[1].ToString()); ClientParamWithSqlConditionAndOpenBase param02 = new ClientParamWithSqlConditionAndOpenBase(); param02.param = new object[] { string.Format(" to_date('{0}','yyyy-mm-dd hh24:mi:ss') - 1",param.param[0].ToString()), string.Format(" to_date('{0}','yyyy-mm-dd hh24:mi:ss') +1",param.param[1].ToString()) }; param02.ob = param.ob; // 需查找一个牌号对应的复合元素,否则会有计算错误 DataSet dsSteelCode = chemservice.ReturnDsOfChemeByAssayDate(param02); foreach(DataRow dr in dsSteelCode.Tables[0].Rows) { steelCode = dr["STEELNAME"].ToString(); if(steelCode.Length == 0) continue; if(listselCode.Contains(steelCode)) { continue; } listselCode.Add(steelCode); } if(listselCode.Count > 0) { listTafac = GetTbb01TafacIngrBySteelCodeList(new ClientParamWithSqlConditionAndOpenBase(new object[] { listselCode }, param.ob)); foreach(string steelCodes in listselCode) { listsel = GetCeqBySteelCode(steelCodes, listTafac); foreach(string strCeq in listsel) { try { param01 = new ClientParamWithSqlConditionAndOpenBase(); param01.param = new object[] { strCeq, ConvertCalChemToMathRound(hsChemList[strCeq.ToUpper()].ToString(), strCeq, listSeq), steelCodes, startDate + endDate }; param01.ob = param.ob; chemservice.StlChemelementCeqByAssaydate_Insert(param01); } catch(Exception ex) { } } } } } catch(Exception ex) { } } } }