Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/common/CssdUtils.java =================================================================== diff -u -r17638 -r17645 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/common/CssdUtils.java (.../CssdUtils.java) (revision 17638) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/common/CssdUtils.java (.../CssdUtils.java) (revision 17645) @@ -3,6 +3,7 @@ import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; +import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; @@ -172,7 +173,7 @@ * 获取config.js内容 * 支持config.js中有中文注释 */ - public static JSONObject getWebConfigInfo(){ + private static JSONObject getWebConfigInfo(){ String configFilePath = getProjectName() + "/config.js"; return getWebConfigInfo(configFilePath); } @@ -207,8 +208,48 @@ } } return jsonObj; - } + } + private static JSONObject writeWebConfigInfo(String configFilePath , String key , String value){ + JSONObject jsonObj = null; + + ObjectMapper mapper = new ObjectMapper().configure( + Feature.ALLOW_COMMENTS, true); + + mapper.configure(Feature.ALLOW_UNQUOTED_FIELD_NAMES, true); + mapper.configure(Feature.ALLOW_SINGLE_QUOTES, true); + Scanner scan = null; + try { + String rootPath = Path.getWebAppRoot() + "/disinfectsystem/config/"; + String content = readFullFile(rootPath + configFilePath); + int startIndex = content.indexOf("{"); + //json变量定义的头(即左花括号之前的部分) + String jsonHeadContent = content.substring(0,startIndex); + int endIndex = (content.lastIndexOf("}") + 1); + if (startIndex != -1 && endIndex != -1 && startIndex < endIndex) { + content = content.substring(startIndex, endIndex); + } + + jsonObj = mapper.readValue(content,JSONObject.class); + + jsonObj.put(key, value); + String writeContent = jsonHeadContent; + writeContent += jsonObj; + + FileWriter writer = new FileWriter(new File(rootPath + configFilePath)); + writer.write(writeContent); + writer.flush(); + writer.close(); + } catch (IOException e) { + e.printStackTrace(); + }finally{ + if(scan != null){ + scan.close(); + } + } + return jsonObj; + } + /** * 根据key获取config.js的配置 * @param key @@ -219,7 +260,7 @@ return null; } JSONObject obj = getWebConfigInfo(); - Object valueObj = obj.get(key); + Object valueObj = obj.opt(key); if(valueObj != null){ return valueObj.toString(); } @@ -238,6 +279,17 @@ } return ret; } + + /** + * 根据key与value对config.js的进行设值 + * @param key + * @return + */ + public static String setAndWriteConfigByNameAndValue(String key , String value){ + String configFilePath = getProjectName() + "/config.js"; + writeWebConfigInfo(configFilePath , key , value); + return null; + } // 判断用户名是否为条形码编码 public static boolean usernameIsBarcode(String username) { return username.matches("^[0-9]{9}$"); @@ -558,7 +610,7 @@ return laststr; } // 读取完整的文件 - public static String readFullFile(String Path) { + private static String readFullFile(String Path) { BufferedReader reader = null; String laststr = ""; try { Index: ssts-web/src/main/java/test/forgon/disinfectsystem/AbstractCSSDTest.java =================================================================== diff -u -r17640 -r17645 --- ssts-web/src/main/java/test/forgon/disinfectsystem/AbstractCSSDTest.java (.../AbstractCSSDTest.java) (revision 17640) +++ ssts-web/src/main/java/test/forgon/disinfectsystem/AbstractCSSDTest.java (.../AbstractCSSDTest.java) (revision 17645) @@ -4,6 +4,8 @@ import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertTrue; +import java.sql.ResultSet; +import java.sql.SQLException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -19,6 +21,8 @@ import net.sf.json.JSONObject; import net.sf.json.util.JSONStringer; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; @@ -115,6 +119,7 @@ import com.forgon.systemsetting.model.HttpOption; import com.forgon.tools.MathTools; import com.forgon.tools.cache.ForgonThreadLocalResourceManager; +import com.forgon.tools.db.DatabaseUtil; import com.forgon.tools.hibernate.ObjectDao; import com.forgon.tools.json.JSONUtil; import com.forgon.treenode.service.THTreeNodeManager; @@ -858,7 +863,27 @@ } + /** + * 清除所有的表数据 + */ public void cleanAll() { + //删除所有的表(根据列出的删除语句) + //deleteAllTable(); + //根据查询当前数据库的表,截断所有的表 + try { + deleteAllTableDynamic(); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + /** + * 删除所有的表(根据列出的删除语句) + * 缺点:所列的表难免不保证有遗漏,代码中有新po增加时,方法里需要及时加上,所以不建议采用 + */ + @Deprecated + private void deleteAllTable(){ //清除基础数据导入导出的几个表数据,如果不清除的话,将会随着测试用例不断运行及时间推移一直累积下去导出基础数据导出失败 objectDao.excuteSQL("delete from HttpOption"); @@ -1023,6 +1048,91 @@ } /** + * 动态delete所有的表(免维护) + * sqlserver和oracle的处理方式略有不同 + */ + private void deleteAllTableDynamic() throws SQLException{ + String database = CssdUtils.getConfigProperty("database"); + //由于测试用例暂未知道数据库是sqlserver还是oracle还是mysql等,所先按sqlserver的方式处理,抛异常后再按oracle处理,再抛异常后再按其它数据库处理... + List sqlList = new ArrayList(); + if(DatabaseUtil.isSqlServer(database)){ + assertTrue(true, "按sqlserver处理删除数据报错"); + //1.按sqlserver处理 + //1.1禁用所有外键 + ResultSet rs = objectDao.executeSql("select 'ALTER TABLE [' + b.name + '] NOCHECK CONSTRAINT ' + a.name disableFk from sysobjects a ,sysobjects b where a.xtype ='f' and a.parent_obj = b.id"); + while(rs.next()){ + sqlList.add(rs.getString("disableFk") + ";"); + } + if(CollectionUtils.isNotEmpty(sqlList)){ + objectDao.excuteSQL(StringUtils.join(sqlList," ")); + } + DatabaseUtil.closeResultSetAndStatement(rs); + + //1.2.截断所有表 + sqlList.clear(); + rs = objectDao.executeSql("select 'delete from [' + name + ']' deleteTable from sysobjects where xtype ='u'"); + while(rs.next()){ + sqlList.add(rs.getString("deleteTable") + ";"); + } + if(CollectionUtils.isNotEmpty(sqlList)){ + objectDao.excuteSQL(StringUtils.join(sqlList," ")); + } + DatabaseUtil.closeResultSetAndStatement(rs); + + //1.3启用所有外键 + sqlList.clear(); + rs = objectDao.executeSql("select 'ALTER TABLE [' + b.name + '] CHECK CONSTRAINT ' + a.name enableFk from sysobjects a ,sysobjects b where a.xtype ='f' and a.parent_obj = b.id"); + while(rs.next()){ + sqlList.add(rs.getString("enableFk") + ";"); + } + if(CollectionUtils.isNotEmpty(sqlList)){ + objectDao.excuteSQL(StringUtils.join(sqlList," ")); + } + DatabaseUtil.closeResultSetAndStatement(rs); + }if(DatabaseUtil.isOracle(database)){ + assertTrue(true, "按sqlserver处理删除数据报错,再按照oracle进行处理删除数据"); + try{ + //1.按oracle处理 + //1.1禁用所有外键 + sqlList.clear(); + ResultSet rs = objectDao.executeSql("select 'alter table '||table_name||' disable constraint '||constraint_name disableFk from user_constraints where constraint_type='R'"); + while(rs.next()){ + sqlList.add("execute immediate '" + rs.getString("disableFk") + "';"); + } + if(CollectionUtils.isNotEmpty(sqlList)){ + objectDao.excuteSQL(StringUtils.join(sqlList," ")); + } + DatabaseUtil.closeResultSetAndStatement(rs); + + //1.2.截断所有表 + sqlList.clear(); + rs = objectDao.executeSql("select 'delete from '||table_name deleteTable from user_tables where NUM_ROWS>0"); + while(rs.next()){ + sqlList.add(rs.getString("deleteTable") + ";"); + } + if(CollectionUtils.isNotEmpty(sqlList)){ + objectDao.excuteSQL(StringUtils.join(sqlList," ") + "commit;"); + } + DatabaseUtil.closeResultSetAndStatement(rs); + + //1.3启用所有外键 + sqlList.clear(); + rs = objectDao.executeSql("select 'alter table '||table_name||' enable constraint '||constraint_name enableFk from user_constraints where constraint_type='R'"); + while(rs.next()){ + sqlList.add("execute immediate '" + rs.getString("enableFk") + "';"); + } + if(CollectionUtils.isNotEmpty(sqlList)){ + objectDao.excuteSQL(StringUtils.join(sqlList," ")); + } + DatabaseUtil.closeResultSetAndStatement(rs); + }catch(Exception e1){ + e1.printStackTrace(); + assertTrue(false, "按oracle处理删除数据也报错"); + } + } + } + + /** * 初始化基础数据 * 任务组:【常规组】(测试供应室)、【术科组】(测试供应室)、【器械组】(测试手术室) * 一次性物品类型:【注射器】、【纱块】 @@ -1708,6 +1818,22 @@ cssdServiceDepts.setTousseType(DisposableGoods.TYPE_NAME); objectDao.save(cssdServiceDepts); + cssdServiceDepts = new CssdServiceDepts(); + cssdServiceDepts.setClinicOrgUnitCode(Constants.ORG_UNIT_CODE_OR); + cssdServiceDepts.setClinicOrgUnitName(Constants.ORG_UNIT_NAME_OR); + cssdServiceDepts.setCssdOrgUnitCode(Constants.ORG_UNIT_CODE_CSSD); + cssdServiceDepts.setCssdOrgUnitName(Constants.ORG_UNIT_NAME_CSSD); + cssdServiceDepts.setTousseType(TousseDefinition.PACKAGE_TYPE_INSIDE); + objectDao.save(cssdServiceDepts); + + cssdServiceDepts = new CssdServiceDepts(); + cssdServiceDepts.setClinicOrgUnitCode(Constants.ORG_UNIT_CODE_OR); + cssdServiceDepts.setClinicOrgUnitName(Constants.ORG_UNIT_NAME_OR); + cssdServiceDepts.setCssdOrgUnitCode(Constants.ORG_UNIT_CODE_CSSD); + cssdServiceDepts.setCssdOrgUnitName(Constants.ORG_UNIT_NAME_CSSD); + cssdServiceDepts.setTousseType(DisposableGoods.TYPE_NAME); + objectDao.save(cssdServiceDepts); + } /** @@ -3350,6 +3476,7 @@ user.setPasswd("1"); user.setOrgUnitIds(orgUnitIds); user.setRoleIds(roleIds); + user.setType(BarcodeDevice.BARCODE_TYPE_USER); sysUserManager.saveUser(user); return user; }