package com.estate.expert.admin.io.processor.impl.matrix; import com.estate.expert.admin.domain.standard.expert.matrix.MembershipMatrix; import com.estate.expert.admin.domain.standard.expert.matrix.MembershipMatrixRowDto; import com.estate.expert.admin.enums.BizResultCode; import com.estate.expert.admin.io.processor.DataProcessorBase; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.xssf.usermodel.XSSFSheet; /** * 隶属度矩阵处理器 * * 用于处理隶属度矩阵信息的读取和写入 */ public class MembershipMatrixProcessor extends DataProcessorBase { public static void validate(float[][][][][] values){ BizResultCode.PARAM_ERROR.check(values == null); // 验证矩阵的维度是否正确 BizResultCode.MATRIX_SIZE_ERROR.check(values.length != 10); int lv1 = 0; for (float[][][][] value : values) { int lv2 = 0; BizResultCode.MATRIX_SIZE_ERROR.check(value.length != 10); for (float[][][] floats : value) { int lv3 = 0; BizResultCode.MATRIX_SIZE_ERROR.check(floats.length != 10); for (float[][] aFloat : floats) { int lv4 = 0; BizResultCode.MATRIX_SIZE_ERROR.check(aFloat.length != 10); for (float[] v : aFloat) { BizResultCode.MATRIX_SIZE_ERROR.check(v.length != 5); var sum = v[0] + v[1] + v[2] + v[3] + v[4]; BizResultCode.NUMBER_NON_NEGATIVE.check(v[0] < 0); BizResultCode.MEMBERSHIP_MATRIX_ERROR.check(Math.abs(sum - 1) > 0.001, "隶属度矩阵每一行的和应该等于1, 错误行:" + lv1 + "-" + lv2 + "-" + lv3 + "-" + lv4); lv4++; } lv3++; } lv2++; } lv1++; } } public static void validateRow(MembershipMatrixRowDto row){ BizResultCode.PARAM_ERROR.check(row == null); BizResultCode.INDEX_RANGE_ERROR.check(row.getP1() < 0 || row.getP1() > 9); BizResultCode.NUMBER_NON_NEGATIVE.check(row.getP2() < 0 || row.getP2() > 9); BizResultCode.NUMBER_NON_NEGATIVE.check(row.getP3() < 0 || row.getP3() > 9); BizResultCode.NUMBER_NON_NEGATIVE.check(row.getP4() < 0 || row.getP4() > 9); var sum = row.getV0() + row.getV1() + row.getV2() + row.getV3() + row.getV4(); BizResultCode.NUMBER_NON_NEGATIVE.check(row.getV0() < 0); BizResultCode.NUMBER_NON_NEGATIVE.check(row.getV1() < 0); BizResultCode.NUMBER_NON_NEGATIVE.check(row.getV2() < 0); BizResultCode.NUMBER_NON_NEGATIVE.check(row.getV3() < 0); BizResultCode.NUMBER_NON_NEGATIVE.check(row.getV4() < 0); BizResultCode.MEMBERSHIP_MATRIX_ERROR.check(Math.abs(sum - 1) > 0.001, "隶属度矩阵每一行的和应该等于1, 错误行:" + row); } @Override protected String[] getHeaders() { return new String [] { "四级隐患", "三级隐患", "二级隐患", "一级隐患", "可忽略", "可容忍", "可接受", "不可接受", "拒绝接受" }; } @Override public String getName() { return "隶属度矩阵"; } @Override protected MembershipMatrix parseSheet(XSSFSheet sheet) { var matrix = new float[10][10][10][10][5]; int rowCount = sheet.getLastRowNum() + 1; BizResultCode.PARAM_ERROR.check(10001 != rowCount); for (int i = 1; i < rowCount; i++) { Row row = sheet.getRow(i); int fourth = (int) row.getCell(0).getNumericCellValue(); int third = (int) row.getCell(1).getNumericCellValue(); int second = (int) row.getCell(2).getNumericCellValue(); int first = (int) row.getCell(3).getNumericCellValue(); String canIgnore = String.valueOf(row.getCell(4).getNumericCellValue()); String canEndure = String.valueOf(row.getCell(5).getNumericCellValue()); String canAccept = String.valueOf(row.getCell(6).getNumericCellValue()); String canNotAccept = String.valueOf(row.getCell(7).getNumericCellValue()); String reject = String.valueOf(row.getCell(8).getNumericCellValue()); matrix[first][second][third][fourth][0] = Float.parseFloat(canIgnore); matrix[first][second][third][fourth][1] = Float.parseFloat(canEndure); matrix[first][second][third][fourth][2] = Float.parseFloat(canAccept); matrix[first][second][third][fourth][3] = Float.parseFloat(canNotAccept); matrix[first][second][third][fourth][4] = Float.parseFloat(reject); var v = matrix[first][second][third][fourth]; var sum = matrix[first][second][third][fourth][0] + matrix[first][second][third][fourth][1] + matrix[first][second][third][fourth][2] + matrix[first][second][third][fourth][3] + matrix[first][second][third][fourth][4]; if(Math.abs(sum - 1) > 0.001){ BizResultCode.MEMBERSHIP_MATRIX_ERROR.check(true, "隶属度矩阵每一行的和应该等于1, 错误行:" + i); } } return new MembershipMatrix(null, matrix); } @Override protected void writeSheet(XSSFSheet sheet, MembershipMatrix data) { var matrix = data.getData(); for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { for (int k = 0; k < 10; k++) { for (int l = 0; l < 10; l++) { var row = sheet.createRow(sheet.getLastRowNum() + 1); row.createCell(0).setCellValue(l); row.createCell(1).setCellValue(k); row.createCell(2).setCellValue(j); row.createCell(3).setCellValue(i); row.createCell(4).setCellValue(matrix[i][j][k][l][0]); row.createCell(5).setCellValue(matrix[i][j][k][l][1]); row.createCell(6).setCellValue(matrix[i][j][k][l][2]); row.createCell(7).setCellValue(matrix[i][j][k][l][3]); row.createCell(8).setCellValue(matrix[i][j][k][l][4]); } } } } } }