package UIB.UIB03.ZBS; import java.util.ArrayList; import java.util.HashMap; import org.springframework.jdbc.support.rowset.SqlRowSet; import org.springframework.jdbc.support.rowset.SqlRowSetMetaData; import CoreFS.SA06.CoreReturnObject; import UIB.COM.XmlSqlParsersFactory; public class RowSetConverter { /** * @desc 表头转换 * @param srs 查询出来的表头信息 * @return */ public HashMap getHeadMap(SqlRowSet srs) { HashMap map = new HashMap(); SqlRowSetMetaData rsmd = srs.getMetaData(); int count = rsmd.getColumnCount(); String columnName = "";//列名 if(srs.next()) { for(int i = 1; i <= count ; i++) { columnName = rsmd.getColumnName(i); map.put(columnName, srs.getString(columnName)); } } return map; } /** * @desc 多行、同一卷的信息生成为一个DataRowList * @param sqlID * @return * @throws Exception */ public ArrayList getDataRowList(SqlRowSet srs , String qcTp) throws Exception { ArrayList list = new ArrayList();//生成的DataRowList放入ArrayList中 CoreReturnObject cro = new CoreReturnObject(); DataRowList drl = null; while(srs.next()) { if(srs.isFirst())//第一行数据存放 { drl = new DataRowList(); list.add(drl); setDataRowList(drl , srs , true , qcTp,false); continue; } //若已经存放过数据,并且当前行的第一列的值与drl数组的最后一个的value值相同,则继续存放 if(srs.getString(1).equals(drl.getValue(0))) { setDataRowList(drl , srs , false , qcTp,true); } else { drl = new DataRowList(); list.add(drl); setDataRowList(drl, srs ,true , qcTp,false); } } // for(int i = 0; i < list.size() ; i++)//由于index是从0开始的,所以需要等号 // { // DataRowList dx = (DataRowList)list.get(i); // dx.print(); // System.out.println("###############################################################"); // } return list; } /** * @desc 查询结果单行转换为DataRowList * @param columnCount 总列数 * @param srs 查询出来数据的集合 * @param flag 钢卷号等信息是否需要存储进来 * @param qcTp q(QLTY)、c(CHEM)成分与材质区分 * @return */ private void setDataRowList(DataRowList drl , SqlRowSet srs , boolean flag , String qcTp,boolean jh) { SqlRowSetMetaData rsmd = srs.getMetaData(); int columnCount = rsmd.getColumnCount();//总列数 String columnName = "";//列名 String columnValue = "";//列值 if(qcTp.equals(QltyCodeDef.CHEM_CD))//成分 { String chemCD = "";//元素名 String chemVal = "";//元素值 String compYn = "";//元素类型(复合元素与单一元素) for(int i = 1; i <= columnCount; i++) { columnName = rsmd.getColumnName(i); columnValue = srs.getString(columnName); if(columnName.equals(QltyCodeDef.ROW_FLAG) && flag) drl.put(columnName, columnValue); else if(columnName.equals(QltyCodeDef.CHEM_CD))//元素名 chemCD = srs.getString(columnName); else if(columnName.equals(QltyCodeDef.CHEM_VAL))//元素值 chemVal = srs.getString(columnName); else if(columnName.equals(QltyCodeDef.COMP_YN))//是否为复合元素 compYn = srs.getString(columnName); else if(flag) drl.put(columnName, columnValue); } drl.put(chemCD, chemVal , compYn); } else if(qcTp.equals(QltyCodeDef.QLTY_CD))//材质 { String key = "";//材质名称,或者钢卷的字段名等 String value = "";//材质值,或者钢卷号的值 String smallName = "";//小中文名 String bigName = "";//大中文名 String extCode = "";//扩展码 String tem = "";//温度 String dir = "";//方向 String size = "";//位置 String temname = "";//位置 String temval = "";//位置 //SQL中的字段名最好也按照该顺序排列 for(int i = 1; i <= columnCount ; i++) { columnName = rsmd.getColumnName(i); columnValue = srs.getString(columnName); if(columnName.equals(QltyCodeDef.ROW_FLAG) && flag) drl.put(columnName, columnValue); else if( columnName.equals(QltyCodeDef.QLTY_CD)) //材质代码 key = columnValue; else if( columnName.equals(QltyCodeDef.QLTY_VAL_WK) )//材质值 value = columnValue; else if( columnName.equals(QltyCodeDef.SMALL_NAME) )//小中文名 smallName = columnValue; else if( columnName.equals(QltyCodeDef.BIG_NAME) )//大中文名 bigName = columnValue; else if( columnName.equals(QltyCodeDef.MS_EXT_CODE) )//扩展码 extCode = columnValue; else if(columnName.equals(QltyCodeDef.ZE_TP) )//中英文区分 { if("E".equals(columnValue))//若为英 { tem = QltyCodeDef.MS_QLTY_TEM_NM_E; dir = QltyCodeDef.MS_QLTY_DIR_NM_E; size = QltyCodeDef.MS_QLTY_SIZE_NM_E; } else { tem = QltyCodeDef.MS_QLTY_TEM_NM; dir = QltyCodeDef.MS_QLTY_DIR_NM; size = QltyCodeDef.MS_QLTY_SIZE_NM; } } ///位置方向,SQL中的MS_QLTY_DIR必须在QLTY_SEQ前面,因为QLTY_SEQ中break。 else if( columnName.equals(QltyCodeDef.MS_QLTY_DIR) ) { //若检测项目为拉力,拉力的位置方向主键用MS_QLTY_DIRTE表示 if(key.indexOf(QltyCodeDef.YS_CD) != -1 || key.indexOf(QltyCodeDef.TE_CD) != -1 || key.indexOf(QltyCodeDef.EL_CD) != -1 || key.indexOf(QltyCodeDef.RP_CD) != -1 || key.indexOf(QltyCodeDef.YR_CD) != -1) if(drl.keyExist(QltyCodeDef.MS_QLTY_DIR+QltyCodeDef.LL_CD ))//若拉力的位置方向已存在 { if(srs.getString(QltyCodeDef.QLTY_CD).indexOf(QltyCodeDef.TE_CD) != -1)//取抗拉强度的方向做为试验方向 drl.set(columnName+QltyCodeDef.LL_CD, srs.getString(QltyCodeDef.MS_QLTY_DIR), dir, bigName, QltyCodeDef.EXT_DIR_CODE); } else//若拉力的位置方向不存在 { drl.put(columnName+QltyCodeDef.LL_CD, srs.getString(QltyCodeDef.MS_QLTY_DIR), dir, bigName, QltyCodeDef.EXT_DIR_CODE); } //如检测项目为冲击 else if(key.indexOf(QltyCodeDef.IM_CD) != -1 && srs.getString(QltyCodeDef.QLTY_SEQ).equals(QltyCodeDef.QLTY_SEQ_1) )//冲击 { if(!drl.keyExist(QltyCodeDef.MS_QLTY_DIR+QltyCodeDef.IM_CD))//如不存在冲击的位置方向值 { drl.put(columnName+QltyCodeDef.IM_CD, srs.getString(QltyCodeDef.MS_QLTY_DIR) , dir , bigName , QltyCodeDef.EXT_DIR_CODE); } } // //落锤 // else if(key.indexOf(QltyCodeDef.DW_CD) != -1 && srs.getString(QltyCodeDef.QLTY_SEQ).equals(QltyCodeDef.QLTY_SEQ_1) )//;落锤 // { // if(!drl.keyExist(QltyCodeDef.MS_QLTY_DIR+QltyCodeDef.DW_CD))//如不存在落锤的位置方向值 // { // drl.put(columnName+QltyCodeDef.DW_CD, srs.getString(QltyCodeDef.MS_QLTY_DIR) , dir , bigName , QltyCodeDef.EXT_DIR_CODE); // } // } } ///温度 else if( columnName.equals(QltyCodeDef.MS_QLTY_TEM) ) { //若检测项目为拉力,拉力的温度主键用MS_QLTY_TEMRP表示 if(key.indexOf(QltyCodeDef.YS_CD) != -1 || key.indexOf(QltyCodeDef.TE_CD) != -1 || key.indexOf(QltyCodeDef.EL_CD) != -1 || key.indexOf(QltyCodeDef.RP_CD) != -1 || key.indexOf(QltyCodeDef.YR_CD) != -1) if(drl.keyExist(QltyCodeDef.MS_QLTY_TEM+QltyCodeDef.LL_CD ))//若拉力的温度已存在 { if(QltyCodeDef.LL_CD.indexOf(srs.getString(QltyCodeDef.QLTY_CD)) != -1)//取抗拉强度的方向做为试验方向 drl.set(columnName+QltyCodeDef.LL_CD, srs.getString(QltyCodeDef.MS_QLTY_TEM), tem, bigName, QltyCodeDef.EXT_TEM_CODE); } else//若拉力的温度不存在 { drl.put(columnName+QltyCodeDef.LL_CD, srs.getString(QltyCodeDef.MS_QLTY_TEM), tem, bigName, QltyCodeDef.EXT_TEM_CODE); } //若检测项目为冲击 else if(key.indexOf(QltyCodeDef.IM_CD) != -1 && srs.getString(QltyCodeDef.QLTY_SEQ).equals(QltyCodeDef.QLTY_SEQ_1) ) { if(!drl.keyExist(QltyCodeDef.MS_QLTY_TEM+QltyCodeDef.IM_CD))//若冲击的温度不存在 { drl.put(columnName+QltyCodeDef.IM_CD, srs.getString(QltyCodeDef.MS_QLTY_TEM) , tem , bigName , QltyCodeDef.EXT_TEM_CODE); } } //落锤 else if(key.indexOf(QltyCodeDef.DW_CD) != -1 && srs.getString(QltyCodeDef.QLTY_SEQ).equals(QltyCodeDef.QLTY_SEQ_1) ) { if(!drl.keyExist(QltyCodeDef.MS_QLTY_TEM+QltyCodeDef.DW_CD))//若落锤的温度不存在 { drl.put(columnName+QltyCodeDef.DW_CD, srs.getString(QltyCodeDef.MS_QLTY_TEM) , tem , bigName , QltyCodeDef.EXT_TEM_CODE); } } } ///试样尺寸 else if( columnName.equals(QltyCodeDef.MS_QLTY_SIZE) ) { if(key.indexOf(QltyCodeDef.IM_CD) != -1 && srs.getString(QltyCodeDef.QLTY_SEQ).equals(QltyCodeDef.QLTY_SEQ_1) ) { if(!drl.keyExist(QltyCodeDef.MS_QLTY_SIZE+QltyCodeDef.IM_CD))//若冲击的温度不存在 { drl.put(columnName+QltyCodeDef.IM_CD, srs.getString(QltyCodeDef.MS_QLTY_SIZE) , size , bigName , QltyCodeDef.EXT_SIZ_CODE); } } // else if(key.indexOf(QltyCodeDef.DW_CD) != -1 && srs.getString(QltyCodeDef.QLTY_SEQ).equals(QltyCodeDef.QLTY_SEQ_1) ) // { // if(!drl.keyExist(QltyCodeDef.MS_QLTY_SIZE+QltyCodeDef.DW_CD))//若冲击的温度不存在 // { // drl.put(columnName+QltyCodeDef.DW_CD, srs.getString(QltyCodeDef.MS_QLTY_SIZE) , size , bigName , QltyCodeDef.EXT_SIZ_CODE); // } // } } ///解决REWORK表中数据的问题 else if( columnName.equals(QltyCodeDef.QLTY_SEQ) && columnValue != null) { drl.put(key+columnValue, srs.getString(QltyCodeDef.QLTY_SEQ_VAL), smallName, bigName, columnValue); if(columnValue.equals(QltyCodeDef.QLTY_SEQ_3)) drl.put(key, srs.getString(QltyCodeDef.QLTY_VAL_WK) , smallName , bigName , srs.getString(QltyCodeDef.MS_EXT_CODE)); break;//因为对该行来说只存储实绩值,没有其他任何要求,所以可以进行break } else if(flag) drl.put(columnName, columnValue); // else if(jh&& columnName.equals(QltyCodeDef.SMP_CUT_LOC)) // { // temname=columnName; // temval=columnValue; // } if(i == columnCount) { drl.put(key, value , smallName , bigName , extCode);//不可以像成分一样放在外面,因为冲击的第一行A1被PUT后,若put在外面,会在上面break后,在外面put,主键会重复 } // if(i == columnCount&&jh) // { // drl.put(key, value , smallName , bigName , extCode);//不可以像成分一样放在外面,因为冲击的第一行A1被PUT后,若put在外面,会在上面break后,在外面put,主键会重复 // drl.put(temname, temval , "交货状态", "交货状态" , temval); // } // } } } /** * 补充拉力项目。针对拉力的check,主要检查5大项是否均已存在,若小于4大项则增加缺少的项,不一定要5个全部存在 */ public static void replenishPullItem(DataRowList drl) { int index= 0;//为0则不补录项,因为没有拉力要求 int endLoc = 0;//性能项目在DataRowList中结束的位置 String[]qltyCD = new String[5];//保存代码 String[]qltyNm = new String[5];//保存名称 StringBuffer sBuffer = new StringBuffer(); for(int i = drl.size()-1; i > 0; i--) { if( QltyCodeDef.TENSILE_TEST.equals(drl.getBigName(i) ))//若大名称为QltyCodeDef.TENSILE_TEST { if(endLoc==0) endLoc = i;//确定性能结束的位置 sBuffer.append(drl.getKey(i)+",");//主键以“key1,key2,key3”的字符串形式存放 } }//for end if( sBuffer.toString().indexOf(QltyCodeDef.YS_CD) == -1)//屈服 { qltyCD[index] = QltyCodeDef.YS_CD; qltyNm[index++] = QltyCodeDef.YS_NM; } if( sBuffer.toString().indexOf(QltyCodeDef.TE_CD) == -1)//抗拉 { qltyCD[index] = QltyCodeDef.TE_CD; qltyNm[index++] = QltyCodeDef.TE_NM; } if( sBuffer.toString().indexOf(QltyCodeDef.EL_CD) == -1)//伸长 { qltyCD[index] = QltyCodeDef.TE_CD; qltyNm[index++] = QltyCodeDef.TE_NM; } if( sBuffer.toString().indexOf(QltyCodeDef.RP_CD) == -1)// { qltyCD[index] = QltyCodeDef.RP_CD; qltyNm[index++] = QltyCodeDef.RP_NM; } if( sBuffer.toString().indexOf(QltyCodeDef.YR_CD) == -1)// { qltyCD[index] = QltyCodeDef.YR_CD; qltyNm[index++] = QltyCodeDef.YR_NM; } if(index >0 && index < 4) //有拉力项目,且小于4项则增加 { endLoc = endLoc+1;//从检验项目的后面一个开始插入 for(int i = 0; i < index ;i++) { drl.add(endLoc+i, qltyCD[i], "", qltyNm[i], QltyCodeDef.TENSILE_TEST, ""); } } } }