package com.vci.server.bof.service; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; import java.util.List; import java.util.ArrayList; import org.hibernate.Session; import com.vci.corba.omd.atm.AttribItem; import com.vci.corba.omd.data.AttributeValue; import com.vci.corba.omd.data.BusinessObject; import com.vci.corba.omd.data.RevisionDataInfo; import com.vci.omd.constants.BusinessConstants; import com.vci.omd.utils.ObjectTool; import com.vci.server.base.persistence.dao.HibernateSessionFactory; import com.vci.server.base.utility.OmdHelper; import com.vci.server.bof.utils.ServerObjectUtil; import com.vci.server.bof.utils.TempTableUtil; import com.vci.common.utility.ObjectUtility; public class BOFactoryBatchServices extends BOFactoryBaseService{ private static BOFactoryBatchServices instance = null; public static synchronized BOFactoryBatchServices getInstance() { if (instance == null) { instance = new BOFactoryBatchServices(); } return instance; } /** * 批量对业务对象进行升版本 * @param ids * @param type * @param currentUser * @return * @throws Exception * @throws Throwable */ public BusinessObject[] batchRevisionBusinessObject(String[] ids, String btmName, String currentUser) throws Exception, Throwable { BusinessObject[] bos = getBatchBusinessObject(ids, btmName); AttribItem[] attrItems = getBOAttributeItem(btmName); String tableName = OmdHelper.getBTTableName(btmName); for (int i = 0; i < bos.length; i ++) { RevisionDataInfo info = BOFactoryServices.getInstance().getNextRevisionValue(tableName, bos[i].nameoid, ObjectTool.getBOAttributeValue(bos[i], BusinessConstants.SELECT_REVISIONRULE), false, ""); bos[i].revisionSeq = info.revisionSeq; bos[i].revisionValue = info.revisionVal; bos[i].fromVersion = bos[i].oid; bos[i].oid = ObjectUtility.getNewObjectID36(); bos[i].revisionid = ObjectUtility.getNewObjectID36(); bos[i].modifier = currentUser; bos[i].creator = currentUser; bos[i].isFirstR = false; bos[i].isLastR = true; bos[i].isFirstV = true; bos[i].isLastV = true; bos[i].versionSeq = 1; bos[i].lcStatus = getLcFirstStatus(ObjectTool.getBOAttributeValue(bos[i], BusinessConstants.SELECT_LCTID)); int len = bos[i].hisAttrValList.length; int alen = attrItems.length; bos[i].newAttrValList = new AttributeValue[alen]; for (int j = 0; j < alen; j++) { bos[i].newAttrValList[j] = bos[i].hisAttrValList[j + len - alen]; } bos[i] = BOFactoryServices.getInstance().createBusinessObject(bos[i], true, false); } return bos; } /** * 通过批量的oid和btmname获取对应的对象信息 * @param oids * @param btmName * @return * @throws Exception * @throws Throwable */ public BusinessObject[] getBatchBusinessObject(String[] oids, String btmName) throws Exception, Throwable { AttribItem[] attrItems = getBOAttributeItem(btmName); String tableName = OmdHelper.getBTTableName(btmName); //Session session = HibernateSessionFactory.getSession(); Connection connection = HibernateSessionFactory.getSessionConnection(); String sql = getBatchSelectBOSql(oids, tableName, attrItems); Statement stmt = connection.createStatement(); ResultSet rs = stmt.executeQuery(sql); List lstBO = new ArrayList(); BusinessObject bo = new BusinessObject(); while (rs.next()) { bo = ServerObjectUtil.createBOByRS(attrItems, rs); lstBO.add(bo); } return lstBO.toArray(new BusinessObject[0]); // SQLQuery query = session.createSQLQuery(sql); // query.executeUpdate(); // List queryList = query.list(); // if (queryList == null || queryList.size() < 1) { // return new BusinessObject[0]; // } // ServerBusinessObject sbo = new ServerBusinessObject(); // String[] queryColumns = sbo.getQueryColumnAccordingToSQL(sql, "SELECT", // "FROM " + tableName); // // BusinessObject[] bos = new BusinessObject[queryList.size()]; // // for (int k = 0; k < queryList.size(); k++) { // ServerBusinessObject csbo = new ServerBusinessObject(); // Object[] array = (Object[]) queryList.get(k); // String attrType = ""; // int j = 0; // for (int i = 0; i < array.length; i++) { // if (i < array.length - attrItems.length) { // attrType = ""; // } else { // attrType = attrItems[j++].vtDataType; // } // csbo.setAttributeValue(queryColumns[i], attrType, array[i]); // } // // BusinessObject bo = csbo.getBusinessObject(); // bos[k] = bo; // } // return bos; } public BusinessObject[] getBatchBusinessObjectByTempOIDs(String[] oids, String btmName) throws Exception, Throwable { AttribItem[] attrItems = getBOAttributeItem(btmName); String tableName = OmdHelper.getBTTableName(btmName); //Session session = HibernateSessionFactory.getSession(); Connection connection = HibernateSessionFactory.getSessionConnection(); TempTableUtil.insertTempOIDs(connection, oids); String sql = getBatchSelectBOSqlByTempOIDs(tableName, attrItems); Statement stmt = connection.createStatement(); ResultSet rs = stmt.executeQuery(sql); List lstBO = new ArrayList(); BusinessObject bo = new BusinessObject(); while (rs.next()) { bo = ServerObjectUtil.createBOByRS(attrItems, rs); lstBO.add(bo); } return lstBO.toArray(new BusinessObject[0]); } /** * 通过批量的oid和btmname获取对应的对象信息 * @param oids * @param btmName * @return * @throws Exception * @throws Throwable */ public BusinessObject[] getBatchBusinessObjects(String btmName, int page, int pageSize) throws Exception, Throwable { AttribItem[] attrItems = getBOAttributeItem(btmName); String tableName = OmdHelper.getBTTableName(btmName); Session session = HibernateSessionFactory.getSession(); String sql = getPageSelectBOSql(tableName, attrItems, page, pageSize); Statement stmt = HibernateSessionFactory.getSessionConnection().createStatement(); ResultSet rs = stmt.executeQuery(sql); List lstBO = new ArrayList(); BusinessObject bo = new BusinessObject(); while (rs.next()) { bo = ServerObjectUtil.createBOByRS(attrItems, rs); lstBO.add(bo); } return lstBO.toArray(new BusinessObject[0]); } /** * 构建查询SQL语句 * * @param oid * @param btmName * @param queryColumns * @return */ private String getBatchSelectBOSql(String[] oids, String btmName, AttribItem[] attrItems) { String sql = ""; StringBuffer sbFields = new StringBuffer( "SELECT OID,REVISIONOID,NAMEOID,BtmName,isLastR,isFirstR,isLastV,isFirstV,Creator,CreateTime,LastModifier," + "LastModifyTime,RevisionRule,VersionRule,RevisionSeq,RevisionValue," + "VersionSeq,VersionValue,LCTID,LCStatus,TS,ID,NAME,DESCRIPTION,OWNER,COPYFROMVERSION");// // + "CHECKINBY,CHECKINTIME,CHECKOUTBY,CHECKOUTTIME,"); for (int i = 0; i < attrItems.length; i++) { sbFields.append(","); sbFields.append(attrItems[i].name); } sbFields.append(" FROM ").append(btmName).append(" p where p.OID in ("); for (int i = 0; i < oids.length; i++) { if ((i != 0) && (i % 500 != 0)) { sbFields.append(","); } sbFields.append("'").append(oids[i]).append("'"); if (i + 1 == oids.length) { break; } if((i + 1) % 500 == 0){ sbFields.append(") or p.OID in ("); } } sbFields.append(")"); sql = sbFields.toString(); return sql; } private String getBatchSelectBOSqlByTempOIDs(String btmName, AttribItem[] attrItems) { String sql = ""; StringBuffer sbFields = new StringBuffer( "SELECT OID,REVISIONOID,NAMEOID,BtmName,isLastR,isFirstR,isLastV,isFirstV,Creator,CreateTime,LastModifier," + "LastModifyTime,RevisionRule,VersionRule,RevisionSeq,RevisionValue," + "VersionSeq,VersionValue,LCTID,LCStatus,TS,ID,NAME,DESCRIPTION,OWNER,COPYFROMVERSION"); //+ "CHECKINBY,CHECKINTIME,CHECKOUTBY,CHECKOUTTIME"); for (int i = 0; i < attrItems.length; i++) { sbFields.append(","); sbFields.append(attrItems[i].name); } sbFields.append(" FROM ").append(btmName).append(" p where p.OID in (select oid from pl_tempoid)"); sql = sbFields.toString(); return sql; } /** * 分页查询指定类型的对象 * @param btmName * @param attrItems * @param page * @param pageSize * @return */ private String getPageSelectBOSql(String btmName, AttribItem[] attrItems, int page, int pageSize) { String sql = ""; StringBuffer sbFields = new StringBuffer( "SELECT OID,REVISIONOID,NAMEOID,BtmName,isLastR,isFirstR,isLastV,isFirstV,Creator,CreateTime,LastModifier," + "LastModifyTime,RevisionRule,VersionRule,RevisionSeq,RevisionValue," + "VersionSeq,VersionValue,LCTID,LCStatus,TS,ID,NAME,DESCRIPTION,OWNER,COPYFROMVERSION"); // + "CHECKINBY,CHECKINTIME,CHECKOUTBY,CHECKOUTTIME,"); for (int i = 0; i < attrItems.length; i++) { sbFields.append(","); sbFields.append(attrItems[i].name); } sbFields.append(" FROM ").append(btmName).append(" p "); if (page > 0 && pageSize > 0) { int start = (page - 1) * pageSize; int end = page * pageSize; sbFields.append("where rownum between ").append(start).append(" and ").append(end); } sql = sbFields.toString(); return sql; } // public static void main(String[] args) { // BOFactoryBatchServices s = new BOFactoryBatchServices(); // StringBuffer sbFields = new StringBuffer(); // sbFields.append(" FROM ").append("abc").append(" p where p.OID in ("); // String[] oids = new String[5]; // for (int i = 0; i < 5; i++) { // oids[i] = "oid" + i; // } // for (int i = 0; i < oids.length; i++) { // if (i != 0 && i%3 != 0) { // sbFields.append(","); // } // sbFields.append("'").append(oids[i]).append("'"); // if (i + 1 == oids.length) { // break; // } // if((i + 1) % 3 == 0){ // sbFields.append(") or p.OID in ("); // } // } // sbFields.append(")"); // // System.out.println(sbFields.toString()); // } }