diff --git a/backend/src/main/java/io/metersphere/api/dto/definition/parse/ESBParser.java b/backend/src/main/java/io/metersphere/api/dto/definition/parse/ESBParser.java index 47e3561102..934ed2cb24 100644 --- a/backend/src/main/java/io/metersphere/api/dto/definition/parse/ESBParser.java +++ b/backend/src/main/java/io/metersphere/api/dto/definition/parse/ESBParser.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import io.metersphere.api.dto.ApiTestImportRequest; import io.metersphere.api.dto.automation.EsbDataStruct; +import io.metersphere.api.dto.definition.parse.esb.ESBExcelSheetInfo; import io.metersphere.api.dto.definition.parse.esb.EsbExcelDataStruct; import io.metersphere.api.dto.definition.parse.esb.EsbSheetDataStruct; import io.metersphere.api.dto.definition.request.processors.pre.MsJSR223PreProcessor; @@ -40,10 +41,14 @@ import java.util.regex.Pattern; */ public class ESBParser extends EsbAbstractParser { - private final int REQUEST_MESSAGE_ROW = 5; - private Map definitions = null; + /** + * 导出模板 + * + * @param response + * @param fileName + */ public static void export(HttpServletResponse response, String fileName) { XSSFWorkbook wb = null; @@ -94,7 +99,6 @@ public class ESBParser extends EsbAbstractParser { short[] colorIndexArr = {IndexedColors.LIGHT_GREEN.getIndex(), IndexedColors.ORCHID.getIndex(), IndexedColors.YELLOW.getIndex()}; for (short colorIndex : colorIndexArr) { XSSFCellStyle style = workbook.createCellStyle(); -// style.setFillForegroundColor(IndexedColors.VIOLET.getIndex()); style.setFillPattern(FillPatternType.SOLID_FOREGROUND); style.setBorderBottom(BorderStyle.THIN); style.setBorderLeft(BorderStyle.THIN); @@ -123,7 +127,6 @@ public class ESBParser extends EsbAbstractParser { if (sheet == null) { return; } - sheet.setColumnWidth(0, 4000); sheet.setColumnWidth(1, 4000); sheet.setColumnWidth(2, 4000); @@ -349,7 +352,6 @@ public class ESBParser extends EsbAbstractParser { } private static void setCellValue(String textValue, Cell cell, XSSFFont font, XSSFCellStyle cellStyle) { -// HSSFRichTextString richString = new HSSFRichTextString(textValue); XSSFRichTextString richString = new XSSFRichTextString(textValue); richString.applyFont(font); if (cellStyle != null) { @@ -393,35 +395,21 @@ public class ESBParser extends EsbAbstractParser { if (headSheet == null) { return importDataStruct; } - int simpleCodeIndex = 0; - int simpleNameIndex = 1; - int apiNameIndex = 6; - int apiDescIndex = 7; - int chineNameIndex = 8; - int descIndex = 9; - int apiPositionIndex = 10; - int cellCount = 11; -// if (isHeadSheet) { - apiNameIndex = 5; - apiDescIndex = 6; - chineNameIndex = 7; - descIndex = 8; - apiPositionIndex = 9; - cellCount = 10; -// } + ESBExcelSheetInfo sheetInfo = this.getEsbExcelSheetInfo(headSheet); int rowCount = headSheet.getLastRowNum(); + //根据模版样式,如果不是报文头,则要取接口信息 if (!isHeadSheet) { Row interfaceInfoRow = headSheet.getRow(1); if (interfaceInfoRow != null) { - List rowDataArr = this.getRowDataByStartIndexAndEndIndex(interfaceInfoRow, 0, cellCount - 1); - if (rowDataArr.size() >= cellCount) { - String interfaceCode = rowDataArr.get(simpleCodeIndex); - String interfaceName = rowDataArr.get(apiNameIndex); - String interfaceDesc = rowDataArr.get(apiDescIndex); + List rowDataArr = this.getRowDataByStartIndexAndEndIndex(interfaceInfoRow, 0, sheetInfo.getCellCount() - 1); + if (rowDataArr.size() >= sheetInfo.getCellCount()) { + String interfaceCode = rowDataArr.get(sheetInfo.getSimpleCodeIndex()); + String interfaceName = rowDataArr.get(sheetInfo.getServiceNameIndex()); + String interfaceDesc = rowDataArr.get(sheetInfo.getServiceScenarioIndex()); if (StringUtils.isEmpty(interfaceName)) { - interfaceName = rowDataArr.get(simpleNameIndex); + interfaceName = rowDataArr.get(sheetInfo.getSimpleNameIndex()); } importDataStruct.setInterfaceInfo(interfaceCode, interfaceName, interfaceDesc); } @@ -431,10 +419,11 @@ public class ESBParser extends EsbAbstractParser { //部分office/wpf生成的文件会出现几万多空行,容易造成内存溢出。这里进行判断,连续五行为空白时认为读取结束。 int blankRowCount = 0; boolean isRequest = true; - for (int startRow = REQUEST_MESSAGE_ROW; startRow < rowCount; startRow++) { + + for (int startRow = sheetInfo.getRequestMessageRow(); startRow < rowCount; startRow++) { Row row = headSheet.getRow(startRow); - List rowDataArr = this.getRowDataByStartIndexAndEndIndex(row, 0, cellCount - 1); - boolean isBlankRow = this.checkBlankRow(rowDataArr, cellCount); + List rowDataArr = this.getRowDataByStartIndexAndEndIndex(row, 0, sheetInfo.getCellCount() - 1); + boolean isBlankRow = this.checkBlankRow(rowDataArr, sheetInfo.getCellCount()); if (!isBlankRow) { String cellFlag = rowDataArr.get(0); if (StringUtils.equals(cellFlag, "输出")) { @@ -452,13 +441,14 @@ public class ESBParser extends EsbAbstractParser { } else { blankRowCount = 0; EsbDataStruct dataStruct = new EsbDataStruct(); - boolean initDataSuccess = dataStruct.initDefaultData(rowDataArr.get(apiNameIndex), rowDataArr.get(apiDescIndex), rowDataArr.get(chineNameIndex), rowDataArr.get(descIndex)); + boolean initDataSuccess = dataStruct.initDefaultData( + rowDataArr.get(sheetInfo.getApiNameIndex()), rowDataArr.get(sheetInfo.getDataTypeIndex()), rowDataArr.get(sheetInfo.getChineNameIndex()), rowDataArr.get(sheetInfo.getDescIndex())); if (!initDataSuccess) { continue; } boolean isHead = isHeadSheet; - if (rowDataArr.size() > cellCount) { - if (StringUtils.equals(rowDataArr.get(apiPositionIndex), "SYS_HEAD")) { + if (rowDataArr.size() > sheetInfo.getCellCount()) { + if (StringUtils.equals(rowDataArr.get(sheetInfo.getApiPositionIndex()), "SYS_HEAD")) { isHead = true; } @@ -769,5 +759,96 @@ public class ESBParser extends EsbAbstractParser { return StringUtils.isBlank(val) ? "" : val; } + private ESBExcelSheetInfo getEsbExcelSheetInfo(Sheet sheet) { + String apiCodeCellName = "交易码"; + String apiNameCellName = "交易名称"; + String serviceNameCellName = "服务名称"; + String serviceScenarioCellName = "服务场景"; + String englishCellName = "英文名称"; + String chineseCellName = "中文名称"; + String dataTypeCellName = "数据类型"; + String descCellName = "备注"; + + int maxContinuityEmptyCellCount = 10; + + ESBExcelSheetInfo sheetInfo = new ESBExcelSheetInfo(); + + int lastRowNum = sheet.getLastRowNum(); + + rowForeach: + for (int rowIndex = 0; rowIndex <= lastRowNum; rowIndex++) { + Row row = sheet.getRow(rowIndex); + if (row != null) { + if (rowIndex == 0) { + int lastCellNumber = row.getLastCellNum(); + + //连续空白数据的统计:超过连续maxContinuityEmptyCellCount个空白数据时,停止读取当前行。 + // (某些Excel进行读取时会有缺陷:单元格没有数据,但是因为格式进行过设置,会一直读取,容易造成内存溢出) + int continuityEmptyCount = 0; + + cellForeach: + for (int i = 0; i <= lastCellNumber; i++) { + Cell cell = row.getCell(i); + if (cell != null) { + String cellValue = this.getCellValue(cell).trim(); + if (StringUtils.isEmpty(cellValue)) { + continuityEmptyCount++; + if (continuityEmptyCount > maxContinuityEmptyCellCount) { + break cellForeach; + } + } else { + continuityEmptyCount = 0; + if (StringUtils.equals(cellValue, apiCodeCellName)) { + sheetInfo.setSimpleCodeIndex(i); + } else if (StringUtils.equals(cellValue, apiNameCellName)) { + sheetInfo.setSimpleNameIndex(i); + } else if (StringUtils.equals(cellValue, serviceNameCellName)) { + sheetInfo.setServiceNameIndex(i); + } else if (StringUtils.equals(cellValue, serviceScenarioCellName)) { + sheetInfo.setServiceScenarioIndex(i); + } + } + } + } + } else { + //根据第一行《服务名称》的起始列下标开始读取, 进行匹配(英文名称、数据类型/长度、中文名称、备注) + int startReadIndex = sheetInfo.getApiNameIndex(); + int lastCellNumber = row.getLastCellNum(); + + int continuityEmptyCount = 0; + cellForeach: + for (int i = startReadIndex; i < lastCellNumber; i++) { + Cell cell = row.getCell(i); + if (cell != null) { + String cellValue = this.getCellValue(cell).trim(); + if (StringUtils.isEmpty(cellValue)) { + continuityEmptyCount++; + if (continuityEmptyCount > maxContinuityEmptyCellCount) { + break cellForeach; + } + } else { + continuityEmptyCount = 0; + if (StringUtils.equals(cellValue, englishCellName)) { + sheetInfo.setApiNameIndex(i); + } else if (StringUtils.equals(cellValue, chineseCellName)) { + sheetInfo.setChineNameIndex(i); + } else if (StringUtils.contains(cellValue, dataTypeCellName)) { + sheetInfo.setDataTypeIndex(i); + } else if (StringUtils.equals(cellValue, descCellName)) { + sheetInfo.setDescIndex(i); + } + } + } + } + if (sheetInfo.installedApiInfoIndex()) { + sheetInfo.countApiPosisionIndex(); + sheetInfo.setRequestMessageRow(rowIndex + 1); + break rowForeach; + } + } + } + } + return sheetInfo; + } } diff --git a/backend/src/main/java/io/metersphere/api/dto/definition/parse/esb/ESBExcelSheetInfo.java b/backend/src/main/java/io/metersphere/api/dto/definition/parse/esb/ESBExcelSheetInfo.java new file mode 100644 index 0000000000..bd1f7c603e --- /dev/null +++ b/backend/src/main/java/io/metersphere/api/dto/definition/parse/esb/ESBExcelSheetInfo.java @@ -0,0 +1,52 @@ +package io.metersphere.api.dto.definition.parse.esb; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author song.tianyang + * @Date 2021/5/6 3:25 下午 + * @Description + */ +@Getter +@Setter +public class ESBExcelSheetInfo { + //交易码下标 + private int simpleCodeIndex = 0; + //交易名称下标 + private int simpleNameIndex = 0; + //服务名下标 + private int serviceNameIndex = 0; + //服务场景下标 + private int serviceScenarioIndex = 0; + + //接口名字下标 + private int apiNameIndex = 0; + //数据类型下标 + private int dataTypeIndex = 0; + //中文名称 + private int chineNameIndex = 0; + //描述 + private int descIndex = 0; + //api位置 + private int apiPositionIndex = 0; + //每一行的单元格最大长度 + private int cellCount = 0; + //请求信息起始行 + private int requestMessageRow = 0; + //允许的最大空白行数(连续超过这个数字的空白行则认为sheet读取结束) + private int maxEmptyRowCount = 20; + + public boolean installedApiInfoIndex() { + return (apiNameIndex != 0 && dataTypeIndex != 0); + } + + public void countApiPosisionIndex() { + apiPositionIndex = apiNameIndex > apiPositionIndex ? apiNameIndex : apiPositionIndex; + apiPositionIndex = dataTypeIndex > apiPositionIndex ? dataTypeIndex : apiPositionIndex; + apiPositionIndex = chineNameIndex > apiPositionIndex ? chineNameIndex : apiPositionIndex; + apiPositionIndex = descIndex > apiPositionIndex ? descIndex : apiPositionIndex; + apiPositionIndex++; + cellCount = apiPositionIndex; + } +} diff --git a/backend/src/main/java/io/metersphere/excel/domain/EsbExcelData.java b/backend/src/main/java/io/metersphere/excel/domain/EsbExcelData.java deleted file mode 100644 index 58d670701d..0000000000 --- a/backend/src/main/java/io/metersphere/excel/domain/EsbExcelData.java +++ /dev/null @@ -1,9 +0,0 @@ -package io.metersphere.excel.domain; - -/** - * @author song.tianyang - * @Date 2021/3/22 7:04 下午 - * @Description - */ -public class EsbExcelData { -} diff --git a/frontend/src/business/components/api/definition/components/complete/EditCompleteTCPApi.vue b/frontend/src/business/components/api/definition/components/complete/EditCompleteTCPApi.vue index be074a4225..1c6d152d49 100644 --- a/frontend/src/business/components/api/definition/components/complete/EditCompleteTCPApi.vue +++ b/frontend/src/business/components/api/definition/components/complete/EditCompleteTCPApi.vue @@ -142,6 +142,22 @@ export default { if (this.basisData.tags instanceof Array) { this.basisData.tags = JSON.stringify(this.basisData.tags); } + if (this.basisData.method == 'ESB') { + let validataResult = this.$refs.esbDefinition.validateEsbDataStruct(this.request.esbDataStruct); + if (!validataResult) { + return; + } + if (this.request.esbDataStruct != null) { + this.esbDataStruct = JSON.stringify(this.request.esbDataStruct); + this.basisData.esbDataStruct = this.esbDataStruct; + } + if (this.request.backEsbDataStruct != null) { + this.basisData.backEsbDataStruct = JSON.stringify(this.request.backEsbDataStruct); + } + if (this.request.backScript != null) { + this.basisData.backScript = JSON.stringify(this.request.backScript); + } + } this.$emit('runTest', this.basisData); } },